Поиск в середине поля not_analyzed

У меня есть индекс Elasticsearch, где одно из полей помечено not_analyzed. Это поле содержит список значений, разделенных пробелами, например:

Value1 Value2 Value3

Теперь я хочу выполнить поиск, чтобы найти документы, в которых это поле содержит «Value2». Я тестировал поиск с использованием префикса текстовой фразы, но поиск «Value2» ничего не дал. С другой стороны, поиск "Value1" или "Value1 Value2" соответствует. Мне не нужна нечеткость при поиске, а нужны только точные совпадения (по этой причине для поля было установлено значение not_analyzed).

Есть ли способ сделать такой поиск?

Исходя из моего ограниченного понимания Elasticsearch, я предполагаю, что мне нужно настроить поле для анализа с помощью анализатора пробелов. Это правильно?


person Nitramk    schedule 16.01.2014    source источник


Ответы (2)


Правильно, использование анализатора Standard или Whitespace, среди прочего, разбило бы слово на части, разделив их пробелами, запятыми и т. Д. A simple_query_string будет соответствовать" Value2 "независимо от его положения в поле документов.

Standard Analyzer также будет вводить ваши поля в нижний регистр, что означает, что будут совпадать только поисковые запросы, написанные в нижнем регистре.

person Nathan Smith    schedule 16.01.2014

Вы можете сделать это с помощью подстановочных знаков, хотя это будет дорогостоящий запрос. Возможно, вам придется установить для "lowercase_expanded_terms" значение false, чтобы получить совпадение.

Когда вы ищете «Value2» и используете подстановочный знак, поиск будет интерпретирован как «value2» после анализа lucene.

query_string: Значение2 * -> Значение интерпретации ES2 *

обратите внимание, что это строчные буквы вашего поиска, это полезно для полей анализа, но в not_analyzed полях у вас не будет совпадений (если исходное значение находится в верхнем регистре)

lowercase_expanded_terms предотвращает это

теперь, если поле not_analyzed, как вы сказали, следующий запрос должен соответствовать вашим документам

    {          
      "size": 10,          
      "query": {
        "query_string": {    
          "query": "title:*Value2*"              
        }
      }
    }

извините за паршивый ответ.

person Daniel Andres Acevedo    schedule 28.08.2019