2015-10-03 6 views
0

Мой документ выглядит следующим образом:ElasticSearch автозавершения для ключевых слов из строки

"hits": { 
     "total": 4, 
     "max_score": 1, 
     "hits": [ 
     { 
      "_index": "test_db2", 
      "_type": "test", 
      "_id": "1", 
      "_score": 1, 
      "_source": { 
       "name": "very cool shoes", 
       "price": 26 
      } 
     }, 
     { 
      "_index": "test_db2", 
      "_type": "test", 
      "_id": "2", 
      "_score": 1, 
      "_source": { 
       "name": "great shampoo", 
       "price": 15 
      } 
     }, 
     { 
      "_index": "test_db2", 
      "_type": "test", 
      "_id": "3", 
      "_score": 1, 
      "_source": { 
       "name": "shirt", 
       "price": 25 
      } 
     } 
     ] 
    } 

Как создать автозаполнения в elasticsearch, как, например: я ставлю во входном слове «ш», после того, что я должен видеть результат

ш OES

SH ampoo

ш ИРТ

.....

Example of what I need

ответ

0

Посмотрите на ngrams. Или, действительно, edge ngrams, вероятно, все, что вам нужно.

Qbox имеет несколько сообщений в блоге о настройке автозаполнения с ngrams, так и для обсуждения более глубокого я отсылаю вас к этим:

https://qbox.io/blog/an-introduction-to-ngrams-in-elasticsearch

https://qbox.io/blog/multi-field-partial-word-autocomplete-in-elasticsearch-using-ngrams

Но только очень быстро, это должно заставить вас начать.

Сначала я создал индекс:

PUT /test_index 
{ 
    "settings": { 
     "analysis": { 
     "analyzer": { 
      "autocomplete": { 
       "type": "custom", 
       "tokenizer": "standard", 
       "filter": [ 
        "standard", 
        "stop", 
        "kstem", 
        "edgengram_filter" 
       ] 
      } 
     }, 
     "filter": { 
      "edgengram_filter": { 
       "type": "edgeNGram", 
       "min_gram": 2, 
       "max_gram": 15 
      } 
     } 
     } 
    }, 
    "mappings": { 
     "doc": { 
     "properties": { 
      "name": { 
       "type": "string", 
       "index_analyzer": "autocomplete", 
       "search_analyzer": "standard" 
      }, 
      "price":{ 
       "type": "integer" 
      } 
     } 
     } 
    } 
} 

Тогда я индексируюсь документы:

POST /test_index/doc/_bulk 
{"index":{"_id":1}} 
{"name": "very cool shoes","price": 26} 
{"index":{"_id":2}} 
{"name": "great shampoo","price": 15} 
{"index":{"_id":3}} 
{"name": "shirt","price": 25} 

Теперь я могу получить автозаполнения результатов с помощью простого match query:

POST /test_index/_search 
{ 
    "query": { 
     "match": { 
     "name": "sh" 
     } 
    } 
} 

который возвращается:

{ 
    "took": 3, 
    "timed_out": false, 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 3, 
     "max_score": 0.30685282, 
     "hits": [ 
     { 
      "_index": "test_index", 
      "_type": "doc", 
      "_id": "3", 
      "_score": 0.30685282, 
      "_source": { 
       "name": "shirt", 
       "price": 25 
      } 
     }, 
     { 
      "_index": "test_index", 
      "_type": "doc", 
      "_id": "2", 
      "_score": 0.19178301, 
      "_source": { 
       "name": "great shampoo", 
       "price": 15 
      } 
     }, 
     { 
      "_index": "test_index", 
      "_type": "doc", 
      "_id": "1", 
      "_score": 0.15342641, 
      "_source": { 
       "name": "very cool shoes", 
       "price": 26 
      } 
     } 
     ] 
    } 
} 

Вот код, который я использовал, чтобы проверить его:

http://sense.qbox.io/gist/0886488ddfb045c69eed67b15e9734187c8b2491

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