2015-07-22 3 views
1

Я читал, чтобы предложение в elasticsearch в блогах, как: https://www.elastic.co/blog/you-complete-meElasticsearch генерировать внушение поле

но вы должны положить в данном name_suggest вашей собственной личности, не способ автоматически добавить данные до name_suggest при сопоставлении объекта.

так обновить это отображение:

curl -X PUT localhost:9200/hotels -d ' 
{ 
    "mappings": { 
    "hotel" : { 
     "properties" : { 
     "name" : { "type" : "string" }, 
     "city" : { "type" : "string" }, 
     "name_suggest" : { 
      "type" :  "completion" 
     } 
     } 
    } 
    } 
}' 

и с этим ставит:

curl -X PUT localhost:9200/hotels/hotel/1 -d ' 
{ 
    "name" :   "Mercure Hotel Munich", 
    "city" :   "Munich", 
    "name_suggest" : "Mercure Hotel Munich" 
}' 
curl -X PUT localhost:9200/hotels/hotel/2 -d ' 
{ 
    "name" :   "Hotel Monaco", 
    "city" :   "Munich", 
    "name_suggest" : "Hotel Monaco" 
}' 
curl -X PUT localhost:9200/hotels/hotel/3 -d ' 
{ 
    "name" :   "Courtyard by Marriot Munich City", 
    "city" :   "Munich", 
    "name_suggest" : "Courtyard by Marriot Munich City" 
}' 

так что мы можем потерять name_suggest поле.

Так что конечная цель состоит в том, когда вы начинаете набирать Ho первый результат будет Hotel

ответ

0

Вы можете сделать это с ngrams если вы хотите частичные совпадения в пределах слов, или edge ngrams, если вы просто хотите, чтобы соответствовать с начала слова.

Вот пример. Я создал индекс, как это:

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": { 
     "doc": { 
      "properties": { 
       "name": { 
        "type": "string", 
        "index_analyzer": "edge_ngram_analyzer", 
        "search_analyzer": "standard" 
       }, 
       "city": { 
        "type": "string" 
       } 
      } 
     } 
    } 
} 

Затем добавили документы:

POST /test_index/doc/_bulk 
{"index":{"_id":1}} 
{"name":"Mercure Hotel Munich","city":"Munich"} 
{"index":{"_id":2}} 
{"name":"Hotel Monaco","city":"Munich"} 
{"index":{"_id":3}} 
{"name":"Courtyard by Marriot Munich City","city":"Munich"} 

Теперь я могу запросить документы с "hot" именем, как это:

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

и I верните правильные документы:

{ 
    "took": 41, 
    "timed_out": false, 
    "_shards": { 
     "total": 1, 
     "successful": 1, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 2, 
     "max_score": 0.625, 
     "hits": [ 
     { 
      "_index": "test_index", 
      "_type": "doc", 
      "_id": "2", 
      "_score": 0.625, 
      "_source": { 
       "name": "Hotel Monaco", 
       "city": "Munich" 
      } 
     }, 
     { 
      "_index": "test_index", 
      "_type": "doc", 
      "_id": "1", 
      "_score": 0.5, 
      "_source": { 
       "name": "Mercure Hotel Munich", 
       "city": "Munich" 
      } 
     } 
     ] 
    } 
} 

Существуют различные способы, которые можно изменить или обобщить. Например, вы можете применить анализатор ngram к полю _all, если вы хотите совместить более чем с одним полем.

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

http://sense.qbox.io/gist/3583de02c4f7d33e07ba4c2def9badf90692a290

+0

Привет, Я не хочу, полные результаты, как ответ, я просто хотел слово 'Hotel' потому, что существует наиболее – Kiwi

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