2015-04-20 6 views
7

Использование помощника по завершению Elasticsearch У меня проблемы с возвратом предложений ввода нескольких слов, соответствующих запросу одного слова.Elicationsearch завершает поиск с помощью ввода нескольких слов

Пример структуры:

PUT /test_index/ 
{ 
    "mappings": { 
     "item": { 
     "properties": { 
      "test_suggest": { 
       "type": "completion", 
       "index_analyzer": "whitespace", 
       "search_analyzer": "whitespace", 
       "payloads": false 
      } 
     } 
     } 
    } 
} 

PUT /test_index/item/1 
{ 
    "test_suggest": { 
     "input": [ 
     "cat dog", 
     "elephant" 
     ] 
    } 
} 

Работа запроса:

POST /test_index/_suggest 
{ 
    "test_suggest":{ 
     "text":"cat", 
     "completion": { 
      "field" : "test_suggest" 
     } 
    } 
} 

с результатом

{ 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "test_suggest": [ 
     { 
     "text": "cat", 
     "offset": 0, 
     "length": 3, 
     "options": [ 
      { 
       "text": "cat dog", 
       "score": 1 
      } 
     ] 
     } 
    ] 
} 

В противном случае запроса:

POST /test_index/_suggest 
{ 
    "test_suggest":{ 
     "text":"dog", 
     "completion": { 
      "field" : "test_suggest" 
     } 
    } 
} 

с результатом

{ 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "test_suggest": [ 
     { 
     "text": "dog", 
     "offset": 0, 
     "length": 3, 
     "options": [] 
     } 
    ] 
} 

Я бы ожидать такой же результат, что и рабочий запрос, соответствующий «кошки собаки». Любые предложения, в чем проблема, и как заставить работать сбойным запросом? Я получаю те же результаты при использовании стандартного анализатора вместо анализатора пробелов. Я хотел бы использовать несколько слов на входную строку, как показано в приведенном выше примере.

ответ

10

Консультант по завершению строительства - это prefix suggester, что означает, что он пытается сопоставить ваш запрос с первыми несколькими символами вводимых им данных. Если вы хотите, чтобы документ, который вы разместили, соответствовал тексту «собака», вам нужно указать «собака» в качестве входного файла.

PUT /test_index/item/1 
{ 
    "test_suggest": { 
     "input": [ 
     "cat dog", 
     "elephant", 
     "dog" 
     ] 
    } 
} 

По моему опыту, ограничение того, чтобы указать входы для соответствия делает завершающие suggesters менее полезным, что другие способы реализации согласования префикса. Мне нравится edge ngrams для этой цели. Я недавно написал в блоге об использовании ngrams, которые могут оказаться полезными: http://blog.qbox.io/an-introduction-to-ngrams-in-elasticsearch

Как простой пример, здесь есть отображение можно использовать

PUT /test_index 
{ 
    "settings": { 
     "analysis": { 
     "filter": { 
      "edge_ngram_filter": { 
       "type": "edge_ngram", 
       "min_gram": 2, 
       "max_gram": 20 
      } 
     }, 
     "analyzer": { 
      "edge_ngram_analyzer": { 
       "type": "custom", 
       "tokenizer": "standard", 
       "filter": [ 
        "lowercase", 
        "edge_ngram_filter" 
       ] 
      } 
     } 
     } 
    }, 
    "mappings": { 
     "item": { 
     "properties": { 
      "text_field": { 
       "type": "string", 
       "index_analyzer": "edge_ngram_analyzer", 
       "search_analyzer": "standard" 
      } 
     } 
     } 
    } 
} 

затем индекс док, как это:

PUT /test_index/item/1 
{ 
    "text_field": [ 
     "cat dog", 
     "elephant" 
    ] 
} 

и любой из этих запросов будет возвращать его:

POST /test_index/_search 
{ 
    "query": { 
     "match": { 
      "text_field": "dog" 
     } 
    } 
} 

POST /test_index/_search 
{ 
    "query": { 
     "match": { 
      "text_field": "ele" 
     } 
    } 
} 

POST /test_index/_search 
{ 
    "query": { 
     "match": { 
      "text_field": "ca" 
     } 
    } 
} 

Her е это код все вместе:

http://sense.qbox.io/gist/4a08fbb6e42c34ff8904badfaaeecc01139f96cf

+2

Поиск + запрос не возвращает текст и в моем случае текст может быть что-нибудь между тремя полями, так как я мог показать точный текст автозаполнения. –

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

  • Нет связанных вопросов^_^