2013-02-09 3 views
6

В упругом поиска, этот фильтрElasticSearch Bool фильтр с фразой (вместо одного слова/тега)

{ 
    "bool": { 
    "must": { 
     "term": { 
     "article.title": "google" 
     } 
    } 
    } 
} 

Правильно возвращает статьи с «Google» в названии.

Однако

{ 
    "bool": { 
    "must": { 
     "term": { 
     "article.title": "google earth" 
     } 
    } 
    } 
} 

не возвращает никаких результатов, несмотря на то, что есть статьи с точными словами «Google Earth» в названии. Я бы хотел, чтобы это было так.

Полный запрос:

{ 
    "size": 200, 
    "filter": { 
    "bool": { 
     "must": { 
     "term": { 
      "article.title": "google maps" 
     } 
     } 
    } 
    }, 
    { 
    "range": { 
     "created_date": { 
     "from": "2013-01-11T02:14:03.352Z" 
     } 
    } 
    }] 
} 
} 

Как вы можете видеть, у меня нет «запрос» - только фильтр, размер и диапазон. Поэтому я полагаю, что ElasticSearch использует анализатор по умолчанию ...?

Что я не понимаю?


EDIT: Для тех, кто ищет решения, вот мой фильтр:

{ 
    "query": { 
    "bool": { 
     "must": { 
     "must_match": { 
      "article.title": "google earth" 
     } 
     } 
    } 
    } 
} 

Узел, что (1) мы обернули булев фильтр с "запросом" и (2) " термин «изменен» на «must_match», что приводит к согласованию всей фразы (в отличие от «match», которая будет искать в статье.title со стандартным анализатором на Google Earth).

Полный запрос выглядит следующим образом:

{ 
    "size": 200, 
    "filter": { 
    "query": { 
     "bool": { 
     "must": { 
      "must_match": { 
      "article.title": "google earth" 
      } 
     } 
     } 
    } 
    } 
} 

FWIW, причина у меня есть это условие в поле «фильтр» (в отличие от использования стандартного запроса) в том, что иногда я хочу использовать " must_not "вместо" must_not ", а иногда я также добавляю другие элементы в запрос.

+0

Как выглядит ваш анализатор для article.title? Если вы анализируете поле с чем-то другим, кроме «Ключевого слова», это поле будет обозначаться в [google] и [earth], что сделает его совпадением с термом. – Zach

+0

Hm, является ли статья из запроса перенесена в фильтр? Я обновил свой вопрос, чтобы проиллюстрировать, что я имею в виду. –

ответ

9

Elasticsearch не использует анализатор вообще, потому что вы использовали term query, который ищет точные термины.

Поле вашего title проанализировано (если вы не указали обратное), поэтому "google earth" будет проиндексирован как два условия ["google","earth"]. Вот почему запрос term для "google" работает, но запрос term для "google earth" не означает, что ТОЧНЫЙ термин не существует.

Если вместо этого вы используете match query, то ваши запросы будут проанализированы перед поиском.

0

Для тех, кто наткнуться на это совсем недавно, посоветуйте, что более кратким способом представления

{"query":{"bool":{"must":{"must_match":{"article.title":"google earth"}}}}} 

это с

{"query":{"match_phrase":{"article.title":"google earth"}}} 
0

Я решил эту взрывая переданную фразу, так что просто меняется.

{"bool":{"must":{"term":{"article.title":"google earth"}}}} 

в

{"bool":{"must":{"term":{"article.title":["google", "earth"]}}}} 

Это не красиво и может быть слишком медленным, если у вас есть много запросов происходит, но это работает.

ПРИМЕЧАНИЕ. Я только что узнал, что это также вернет любые результаты с помощью «google» или «earth». .

0

Использования Elasticsearch 5.4.2, мое решение эволюционировало быть следующим:

{"query": { 
    "bool": { 
     "must": { 
      "match_phrase": { 
       "article.title": "google earth"}}}}} 

Надеется, что это помогает кому-то.

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