Как искать как единственное, так и множественное число слов вasticsearch? - PullRequest
0 голосов
/ 08 апреля 2019

Я делаю эластичный запрос, используя объект Q, и я проиндексировал документы, один из документов содержит «jbl динамика великолепна», но в моем запросе вместо «ораторов» есть «динамик». Как мне найти этот документ со строкой запроса.

Я пробовал match_phrase, но не смог найти этот документ, и когда я попробовал query_string, он выдал ошибку, говорящую "query_string не поддерживает какой-то ключ". Я также попробовал подстановочный знак, но он также не работает с запросом типа

{
  "query": {
    "bool": {
      "must": [
        {
          "match_phrase": {
            "prod_group": "06"
          }
        },
        {
          "match_phrase": {
            "prod_group": "apparel"
          }
        },
        {
          "wildcard": {
            "prod_cat_for_search": "+speaker*"
          }
        },
        {
          "range": {
            "date": {
              "gte": "2018-04-07"
            }
          }
        }
      ]
    }
  }
}
Q('match_phrase', prod_cat_for_search='speaker')

Я ожидаю, что выходной документ содержит ораторов, но фактический вывод - это документ, не содержащий ораторов

1 Ответ

0 голосов
/ 08 апреля 2019

Тип поиска, который вы ищете, может быть достигнут при использовании фильтра маркеров stemmer во время индексации.

Давайте посмотрим, как это работает, используя пример сопоставления, как показано ниже:

PUT test
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "type": "custom",
          "filter": [
            "lowercase",
            "my_stemmer"
          ],
          "tokenizer": "whitespace"
        }
      },
      "filter": {
        "my_stemmer": {
          "type": "stemmer",
          "name": "english"
        }
      }
    }
  },
  "mappings": {
    "doc": {
      "properties": {
        "description": {
          "type": "text",
          "analyzer": "my_analyzer",
          "fields": {
            "keyword": {
              "type": "keyword"
            }
          }
        }
      }
    }
  }
}

Для поля description в приведенном выше отображении мы использовали анализатор как my_analyzer.Этот анализатор будет применять фильтры токенов lowercase и my_stemmer.my_stemmer будет применяться english к входному значению.

Например, если мы проиндексируем документ, как показано ниже:

{
   "description": "JBL speakers build with perfection"
}

Индексируемые токены:

jbl
speaker
build
with
perfect

Обратите внимание: speakers индексируется как speaker, а perfection как perfect.

Теперь, если вы ищете speakers или speaker, оба совпадут.Точно так же, если вы ищете perfect, приведенный выше документ будет совпадать.

Почему speakers или perfection будут совпадать, возможно, у вас возник вопрос.Причина этого заключается в том, что по умолчанию для эластичного поиска применяется тот же анализатор, который использовался при индексации также во время поиска.Так что, если вы ищете perfection, он будет фактически искать perfect и, следовательно, совпадение.

Подробнее о stemming .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...