2015-10-01 4 views
1

У меня есть документ, который имеет ниже данные:Упругого Поиск фразовом дает нежелательным результатам

Hello World and 

bmw Master World 

Hello 

Так документы содержат 3 строки, как показано выше, и я индексировал документ к моему упругому поисковому серверу. Я использую следующий запрос match_phrase для поиска точной фразы: «World Hello».

:query=>{ :match_phrase=>{ :text=> "World Hello" } } 

Удивительно, но возвращает вышеуказанный документ.

Следует отметить, что этот документ не содержит фразу «World Hello». Но вторая строка заканчивается «Миром», а 3-я строка начинается с «Hello». Является ли причина, по которой вышеупомянутый документ соответствует запросу.

+0

так, это документ 3 строки? не могли бы вы показать свои сопоставления? но, я уверен, это потому, что для индекса это просто большая строка слов, разделенных разделителями – Mysterion

ответ

0

Возможно, вам захочется немного почитать о том, как работает analysis.

Также ознакомьтесь с этим описанием phrase matching. Термины во фразе не должны появляться в точной последовательности вашего запроса, первая должна просто появиться перед второй. Поскольку есть "hello", который приходит после "world", документ соответствует вашему запросу.

Также обратите внимание, что здесь используется standard analyzer, как при индексировании документа, так и при анализе запроса, поскольку никаких других анализаторов не указано. Вы можете настроить это поведение, если хотите.

Как простой пример, я создал тривиальный индекс:

PUT /test_index 

затем индексированный документ (с новой строкой бежала):

PUT /test_index/doc/1 
{ 
    "doc_text": "Hello World and \n\nbmw Master World\n\nHello" 
} 

затем проиндексирован еще один с последним «Hello» удален :

PUT /test_index/doc/2 
{ 
    "doc_text": "Hello World and \n\nbmw Master World" 
} 

Теперь, если я запустил ваш запрос, возвращается только первый документ:

POST /test_index/_search 
{ 
    "query": { 
     "match_phrase": { 
     "doc_text": "World Hello" 
     } 
    } 
} 
... 
{ 
    "took": 2, 
    "timed_out": false, 
    "_shards": { 
     "total": 1, 
     "successful": 1, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 1, 
     "max_score": 0.4459011, 
     "hits": [ 
     { 
      "_index": "test_index", 
      "_type": "doc", 
      "_id": "1", 
      "_score": 0.4459011, 
      "_source": { 
       "doc_text": "Hello World and \n\nbmw Master World\n\nHello" 
      } 
     } 
     ] 
    } 
} 

Вы можете сами доказать, почему это происходит, используя term vectors. Я не буду вдаваться в подробности здесь, но вот некоторый код, который вы можете использовать, чтобы исследовать, если вы хотите:

http://sense.qbox.io/gist/3ee955b8389d1b36ea56788654955c519e2bb429

+0

Спасибо sloan ... Это действительно помогло получить ответ .... –