2015-04-20 29 views
7

Elasticsearch tamamlama önerisini kullanma Tek sözcüklü bir sorgu ile eşleşen çok sözcüklü giriş önerilerini döndürme sorunlarım var.Elasticsearch tamamlanması, çok sözcüklü girişlerle arama yapılmasını önerir

Örnek yapısı:

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" 
     ] 
    } 
} 

çalışma sorgusu:

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

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

başarısız sorgu ile

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

Sonuç

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

ile

ben 'kedi köpek' eşleştirme, çalışma sorgu olarak aynı sonucu beklenebilir. Sorunun ne olduğu ve başarısız olan sorgulamanın nasıl yapıldığına dair herhangi bir öneriniz var mı? Beyaz çözüm yerine standart analizörü kullanırken aynı sonuçları elde ediyorum. Yukarıdaki örnekte gösterildiği gibi giriş dizesi başına birden fazla sözcük kullanmak istiyorum.

cevap

10

Tamamlama önerisi bir prefix suggester, yani sorgunuzu, verilmiş olan girdilerin ilk birkaç karakteriyle eşleştirmeye çalışır. Gönderdiğiniz dokümanın "köpek" metniyle eşleşmesini istiyorsanız, giriş olarak "köpek" belirtmeniz gerekir. Tecrübelerime göre

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

, maç için girdi belirtmek zorunda sınırlandırılması başka yollar önek eşleşmesini uygulamak tamamlanmasının öneride bulunanları daha az kullanışlı hale getirir. Bu amaçla edge ngrams'u seviyorum. Geçenlerde yararlı bulabileceğiniz ngrams kullanma hakkında bir blog yazısı yazdı:

PUT /test_index/item/1 
{ 
    "text_field": [ 
     "cat dog", 
     "elephant" 
    ] 
} 
: http://blog.qbox.io/an-introduction-to-ngrams-in-elasticsearch

hızlı bir örnek olarak, burada bir eşleme Eğer doktor böyle

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" 
      } 
     } 
     } 
    } 
} 

sonra endeksi kullanabilirsiniz olduğu

ve bu sorguları herhangi bunu döndürür:

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" 
     } 
    } 
} 

Onun

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

+2

arama + sorgusu üç alanlar arasında herhangi bir şey olabilir metni dönen ve benim durumda metinde değil, bu yüzden nasıl ben otomatik tamamlamada tam metni gösterilebilir: e hep birlikte kod. –