2015-11-27 3 views
1

Я играю с фильтрами в elasticsearch (мы используем старую версию 1.3.1), и мне нужно отфильтровать результаты поиска по любому полю. При запросе, это можно сделать так:Elasticsearch: фильтр по любому полю

"query": { 
    "query_string": { 
    "query": "_all:test" 
    } 
} 

Но фильтры, кажется, не работает с _all заявление. Что я могу сделать? Может ли новая версия elasticsearch решить мою проблему?

Заранее благодарен!

PS: Мне нужно найти точные значения, поэтому я не могу использовать запросы. Существует разница между запросами и фильтров - если вы ищете my brown, то вы можете ожидать результатов, как:

my brown

This is my brown dog.

someone stolen my brown wallet

Но фильтр будет возвращать только my brown, и это Что мне нужно.

ответ

1

Возможно, вы захотите немного узнать о различии между queries and filters. То, что вы делаете, есть query string query.

Если вы на самом деле хотите, чтобы фильтровать против точных текстовых маркеров (читать на analysis, если вы не знаете, что я имею в виду под «лексемы»), и у вас есть отображение настроить таким образом, что "_all" field ведет себя, как вы» повторно ожидая затем попробовать что-то вроде этого:

POST /test_index/_search 
{ 
    "query": { 
     "filtered": { 
     "filter": { 
      "term": { 
       "_all": "test" 
      } 
     } 
     } 
    } 
} 

Если, с другой стороны, вы хотите, чтобы некоторый анализ (так что "Test" разбивается на лексемы к "test", например), вы можете вместо этого:

POST /test_index/_search 
{ 
    "query": { 
     "match": { 
     "_all": "Test" 
     } 
    } 
} 

Вот код, я использовал, чтобы поиграть с ним:

http://sense.qbox.io/gist/44adf2c2ade8abd6758f0e08ed2e40434850fc1c

+0

Спасибо за ваши советы. Однако вся полевая документация говорит, что это поле анализируется, и это не хорошо для меня, потому что фильтры работают IMHO только с not_analyzed полями. И я не могу использовать запрос соответствия, потому что он не возвращает точно точные результаты - найденная строка не обязательно такая же, как заданное выражение поиска. – Firzen

+0

Gotcha. На всех этих ограничениях ваш вопрос был не совсем ясен. Во-первых, вы можете установить анализатор в поле '_all'; здесь [пример] (http://sense.qbox.io/gist/9f897c2a17078a48a8a88b14e9f93a0d83a1c493) с использованием токенизатора пробелов (похоже, это может быть правильным для вашего прецедента). Вы также можете использовать настраиваемое поле «все», как описано [здесь] (https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-all-field.html#custom-all-fields) , –

+0

Это именно то, чего я не хочу - когда я ищу «Тест», результат правильный, потому что возвращается только запись с полем 2 = «Тест». Bud, когда я ищу «тест», возвращает упругую запись с полем 2 = «это тест», и это неверно, потому что строки не совсем одинаковы. Мне нужны действительно точные результаты поиска с полем _all. – Firzen