Завершение Elasticsearch предлагает поиск с вводами нескольких слов
используя завершение Elasticsearch suggester у меня есть проблемы с возвратом предложений ввода нескольких слов, соответствующих односложному запросу.
пример структуру:
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": []
}
]
}
Я ожидал бы того же результата, что и рабочий запрос, соответствующий "cat dog". Любые предложения, в чем проблема и как сделать запрос не работает? Я получаю те же результаты при использовании стандартного анализатора вместо анализатора пробелов. Я хотел бы использовать несколько слов на входную строку, как показано в примере выше.
1 ответов
завершение suggester является префикс suggester, что означает, что он пытается сопоставить ваш запрос с первыми несколькими символами входных данных, которые он был дан. Если вы хотите, чтобы документ, который вы разместили, соответствовал тексту "собака", вам нужно будет указать" собака " в качестве ввода.
PUT /test_index/item/1
{
"test_suggest": {
"input": [
"cat dog",
"elephant",
"dog"
]
}
}
по моему опыту, ограничение необходимости указывать входные данные для соответствия делает завершение suggesters менее полезным, чем другие способы реализации сопоставления префиксов. Мне нравится края 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"
}
}
}
}
}
затем индексируйте doc следующим образом:
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"
}
}
}
вот код, все вместе:
http://sense.qbox.io/gist/4a08fbb6e42c34ff8904badfaaeecc01139f96cf