Как найти все объекты, содержащие «бла» в Elasticsearch? - PullRequest
0 голосов
/ 10 июня 2019

Я использовал подстановочный знак примерно так: *blah* Но в документе указано, что вам не следует начинать использование подстановочного знака с *, поскольку это может увеличить требуемые итерации и снизить производительность поиска..

Кроме того, в документах нет указаний на то, предназначен ли подстановочный знак без учета регистра.Я заметил, что когда я искал строчную букву «а», я возвращал все, что имело как «а», так и «А», но когда я искал заглавную букву «А», то есть буквально *A*, я не получил никаких результатов привсе.

Я хочу, чтобы этот конкретный поиск вел себя точно так же, как, например, ORM Django вел себя, если бы я использовал filter(title__icontains=‘blah’), включая нечувствительность к регистру .Поэтому, если я скажу get me all records that contain the word ‘the’ in the title, я ожидаю, что будет возвращено что-либо с «» (без учета регистра) в заголовке.

1 Ответ

1 голос
/ 11 июня 2019

Я не знаю, как обойти осторожный подход с использованием подстановочного запроса, поэтому вот как это будет выглядеть, если у вас просто возникли проблемы с синтаксисом:

GET /_search
{
  "query": {
    "wildcard": {
      "title": {
        "value": "*elved*",
        "boost": 1.0,
        "rewrite": "constant_score"
      }
    }
  }
}

Я только что проверил этот тип запроса в своем собственном поисковом индексе и произвел поиск *oam* правильно подобранного «вспенивания» в названиях продуктов.


А что касается нечувствительности к регистру , это должно быть обработано "из коробки", если вы используете один из встроенных анализаторов (например, Standard или English ).Но если вы используете собственный анализатор, то вам просто нужно обязательно включить фильтр lowercase вместе с любыми другими фильтрами, через которые вы хотите выполнить условия.

PUT index_name
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_custom_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase"
          ]
        }
      }
    }
  }
}

Есливы не указываете анализатор в вашем отображении поля, тогда я думаю, что он использует standard по умолчанию, что включает в себя фильтрацию строчных букв.

...