Elasticsearch в Django - сортировка по алфавиту - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть следующий документ:

@brand.doc_type
class BrandDocument(DocType):

    class Meta:
        model = Brand

    id = IntegerField()
    name = StringField(
        fields={
            'raw': {
                'type': 'keyword',
                'fielddata': True,
            }
        },
    )
    lookup_name = StringField(
        fields={
            'raw': {
                'type': 'string',
            }
        },
    )

, и я пытаюсь сделать поиск, используя это:

BrandDocument.search().sort({
    'name.keyword': order,
})

Проблема в том, что я получаю результаты, отсортированные в случаечувствительный способ, который означает, что вместо 'a', 'A', 'ab', 'AB' я получаю 'A', 'AB', 'a', 'ab'.Как это можно исправить?

РЕДАКТИРОВАТЬ После некоторого дополнительного поиска я обнаружил что-то вроде этого:

lowercase_normalizer = normalizer(
    'lowercase_normalizer',
    filter=['lowercase']
)
lowercase_analyzer = analyzer(
    'lowercase_analyzer',
    tokenizer="keyword",
    filter=['lowercase'],
)


@brand.doc_type
class BrandDocument(DocType):

    class Meta:
        model = Brand

    id = IntegerField()
    name = StringField(
        analyzer=lowercase_analyzer,
        fields={
            'raw': Keyword(normalizer=lowercase_normalizer, fielddata=True),
        },
    )

Однако проблема сохраняется, и яне могу найти в документах, как использовать этот нормализатор.

1 Ответ

0 голосов
/ 22 ноября 2018

Я бы предложил создать собственный анализатор со строчным фильтром и применить его к полю при индексации.

Поэтому необходимо обновить следующее в индексе settings :

{
  "index": {
    "analysis": {
      "analyzer": {
        "custom_sort": {
          "tokenizer": "keyword",
          "filter": [
            "lowercase"
          ]
        }
      }
    }
  }
}

Добавьте поле (на основе которого вам нужно отсортировать) в сопоставлении с анализатором custom_sort , как показано ниже:

{
    "properties":{
        "sortField":{
            "type":"text",
            "analyzer":"custom_sort"
        }
    }
}

Еслиполе уже существует в отображении, тогда вы можете добавить подполя к существующему полю с помощью анализатора, как показано ниже.

Предполагая, что поле name , имеющее тип как ключевое слово уже существует, обновите его следующим образом:

{
    "properties":{
        "name":{
            "type": "keyword",
            "fields":{
                "sortval":{
                    "type":"text",
                    "analyzer":"custom_sort"
                }
            }
        }
    }
}

После того, как вы это сделаете, вам нужно будет переиндексировать ваши данные так, чтобы значения в нижнем регистре были проиндексированы.Затем вы можете использовать поле для сортировки как:

Случай 1 (новое поле):

"sort": [
    {
      "sortField": "desc"
    }
  ]

Случай 2 (подполе):

"sort": [
    {
      "name.sortval": "desc"
    }
  ]
...