2013-09-09 5 views
12

Я новичок в поиске эластичности, и мне интересно, как я могу выполнить поиск, указав одно или несколько полей.Поиск по нескольким полям с эластичным поиском

С SQL я бы написал этот вопрос:

"SELECT field1, field2, field3 FROM tablename WHERE field1 = 'X' AND field2 != 'Y' AND field3 = 'Z'" 

В упругом поиска Я начиная с этого:

{ 
    "query": { 
     "filtered": { 
      "query": { 
       "query_string": { 
        "query": "*" 
       } 
      }, 
      "filter": { 
       "term" : { 
        "field1" : "286" 
       } 
      } 
     } 
    } 
} 

ответ

16

Вам нужно выбрать правильный запрос для задания, который может быть тяжелым в начале. Вы можете определенно использовать запрос bool, чтобы объединить всевозможные разные запросы вместе, как уже было предложено. Также есть запросы, которые позволяют выполнять несколько полей, а также внутренне отображать на логические запросы. Кроме того, term queries не так распространены в производственной системе, так как они не поддерживают какой-либо анализ текста, в то время как вы обычно хотите анализировать запрос так, как это было с индексом поля, которое вы запрашиваете.

Одним из наиболее распространенных запросов в elasticsearch является запрос соответствия, который работает в одном поле. И есть еще один запрос с теми же параметрами, которые также работают на нескольких полях, называемых multi_match. Эти запросы поддерживают анализ текста и работают очень хорошо. Я бы предложил использовать их для запроса query_string, например, который намного более мощный, но подвержен ошибкам, а также из-за необходимого процесса синтаксического анализа. Я бы сказал, что используйте query_string, только если вам нужна одна из его функций (например, задание имен полей или логических операторов в самом запросе), в противном случае - для запросов соответствия.

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

И взгляните на все запросы, доступные с помощью the query DSL, и поиграйте с ними, просто чтобы почувствовать все, что вы можете сделать.

+1

Помимо того, что он хорошо написан, этот пост был невероятно полезен. Благодарим вас за разъяснения и ссылки на источники. –

+0

Добро пожаловать, спасибо за вашу приятную обратную связь @ AndreasKavountzis! – javanna

+0

Как бы вы объединили 'multi_match' с' match_phrase_prefix'? Я хочу найти подстроку в нескольких полях. Он не должен соответствовать всем полям, если он существует в одном из них. – Chrillewoodz

19

Запрос SQL эквивалентно:

{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "term": { 
      "field1": "X" 
      } 
     }, 
     { 
      "term": { 
      "field3": "Z" 
      } 
     } 
     ], 
     "must_not": { 
     "term": { 
      "field2": "Y" 
     } 
     } 
    } 
    } 
} 

В любом случае я рекомендую вам немного прочитать документ, прежде чем начинать с elasticsearch, если вы новичок.

Существует множество типов запросов, и некоторые из них зависят от того, как вы индексируете свои данные, например, для строк, вы можете анализировать строки (строчные, стековые слова, удалять стоп-слова, ...) во время индекса. Выбранный вами запрос никогда не будет соответствовать документу, поле 1 которого «X», если вы проанализируете это поле во время индекса и преобразуете его в нижний регистр.

Как только вы знаете немного лучше elasticsearch, вы можете использовать фильтры для улучшения ваших запросов.

+0

Что делать, если я хотел найти поле1 для «X» и «Q»? Я устал что-то вроде: «field1»: [«X», «Q»], но не работал. – codeBarer

+0

@codeBarer использует термин query вместо term query. Посмотрите на это => http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-terms-query.html – moliware

Смежные вопросы