2016-04-25 3 views
0

У меня возникли проблемы с созданием адресного поискового запроса в ElasticSearch.Elasticsearch многопользовательский запрос

Адрес хранится в ES со следующей структурой:
Адрес { улица, города, почтовый индекс }

А вот пример запроса:

GET /adr-address/_search 
{ 
    "query": { 
    "multi_match": { 
     "query":  "mainstreet, houston", 
     "type":  "most_fields", 
     "fields":  [ "street", "city", "zipcode"] 
    } 
    } 
} 

"hits": [ 
{ 
     "_source": { 
     "id": "S6v4xyO8UE5NRcWtmMATPQ==", 
     "street": "Houston 2nd Avenue", 
     "zipcode": "8032", 
     "city": "Houston" 
    } 
}, 
{ 
    "_source": { 
     "id": "aLgQFrO8zCT8m88lAnYZPQ==", 
     "street": "Houston 1st Avenue", 
     "zipcode": "8044", 
     "city": "Houston" 
    } 
}, 
{ 
    "_source": { 
     "id": "aLgQFrO8zCT8m88lAnYZPQ==", 
     "street": "mainstreet", 
     "zipcode": "8044", 
     "city": "Houston" 
    } 
}, 

Мульти матч запрос работает отлично в большинстве случаев, за исключением сценария, когда улица содержит название города. Elasticsearch уделяет более высокий приоритет этим результатам, что вполне понятно, хотя и неприемлемо.

Вот результат _analyze:

GET /adr-address/_validate/query?explain 
{ 
    "query": { 
    "multi_match": { 
     "query":  "mainstreet, houston", 
     "type":  "most_fields", 
     "fields":  [ "street", "city", "zipcode" ] 
    } 
    } 
} 

{ 
    "valid": true, 
    "_shards": { 
     "total": 1, 
     "successful": 1, 
     "failed": 0 
    }, 
    "explanations": [ 
     { 
     "index": "adr-address", 
     "valid": true, 
     "explanation": "(zipcode:mainstreet zipcode:houston) (street:mainstreet street:houston) (city:mainstreet city:houston)" 
     } 
    ] 
} 

Следует отметить, что Google Maps API возвращает точные результаты для того же самого запроса.

Предположения/условия сделали до сих пор:

  1. Tokenizers являются: пробел, запятая, цифры и т.д.
  2. Входной термин может содержать мульти название слово улица, почтовый индекс или город в любом порядке

Любое предложение о том, как я могу улучшить поиск повторно?

+0

Я не знаю, но вы пытались изменить порядок: [ "город", "почтовый индекс", "улица"]? –

+0

Да, но это не помогло, а также объяснение _analyze показывает, что он ищет все термины в обоих полях – shailendher

+0

Я предполагаю, что опция copy_to - это то, что мне нужно. Скопируйте все значения в новое поле и выполните поиск там. https://www.elastic.co/guide/en/elasticsearch/guide/current/field-centric.html Я должен знать, будет ли это работать завтра. – shailendher

ответ

0

Попробуйте использовать cross_fields вместо most_fields как тип для multi_match.

Из документов:

Тип cross_fields особенно полезен с структурированными документами , где несколько полей должны совпадать. Например, при запросе полей first_name и last_nameдля «Will Smith» наилучшее совпадение - , вероятно, имеет «Воля» в одном поле и «Смит» в другом.

И наиболее популярные поля, которые вы используете, предназначены для поиска по одному и тому же тексту, но проанализированы по-разному.

Пример запроса:

GET /adr-address/_search 
{ 
    "query": { 
    "multi_match": { 
     "query":  "mainstreet, houston", 
     "type":  "cross_fields", 
     "fields":  [ "street", "city", "zipcode"] 
    } 
    } 
} 

link to docs

+0

Да, это именно то, что я сейчас пытаюсь сделать, и это выглядит очень многообещающе. Я буду отмечать это как принятый ответ, как только я закончу завтра. – shailendher

+0

работает отлично! вот мой окончательный запрос: 'GET/adr-address/_validate/query?объяснить { "запрос": { "multi_match": { "запрос": "MainStreet, Хьюстоном", "типа": "cross_fields", "minimum_should_match": 2, "поля": [ «улица «город», «zipcode», «state»] } } } ' – shailendher

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