Elasticsearch 7.x сортировка без учета регистра с использованием нормализатора - PullRequest
0 голосов
/ 13 января 2020

Я используюasticsearch 7.5 и клиент NEST.

Я хочу отсортировать запрос, и, как вы знаете, по умолчанию это A..Za..z. Я хочу, чтобы он не учитывал регистр.

Я пытаюсь использовать нормализатор, как объяснено здесь

PUT /testindex
{
  "settings": {
     "analysis": {
       "normalizer": {
         "case_insensitive": {
            "filter": "lowercase"
         }
        }
       }
     }
}

И тогда я мог бы использовать его в отображении:

PUT /testindex/_mapping/testmapping
{
  "properties": {
    "Id": {
    "type": "keyword"
    },
    "Name": {
      "type": "text",
      "fields": {
        "keyword": {
          "type": "keyword",
          "normalizer": "case_insensitive"
        }
      }
     }
   }
}

Проблема возникает, когда я пытаюсь сделать это на C# клиенте NEST:

client.Indices.Create("testindex", e => e
                .Settings(s => s
                    .Analysis(a => a
                        .Normalizers(n => n.Custom("case_insensitive",c => c.Filters("lowercase")))))
                .Map(m => m
                    .Properties(p => p
                       .Text(st => st.Name("Name")
                       **.NORMALIZER**)))
            );

Невозможно добавить нормализатор в поле свойства Name.

Есть идеи? Еще один способ сделать это эффективно?

Спасибо миллион.

1 Ответ

3 голосов
/ 13 января 2020

Это свойство является частью свойств типа ключевого слова, как документы скажем.

Свойство нормализатора полей ключевых слов аналогично анализатору, за исключением того, что оно гарантирует, что цепочка анализа создает одиночный токен.

Просто смените реквизит. к ключевому слову поле позволит разместить нормализатор

await client.Indices.CreateAsync("testindex", e => e
    .Settings(s => s
        .Analysis(a => a
            .Normalizers(n => n.Custom("case_insensitive", c => c.Filters("lowercase")))))
    .Map(m => m
        .Properties(p => p
            .Keyword(st => st.Normalizer("case_insensitive").Name("Name"))))
);

Надеюсь, что поможет.

...