2015-04-20 21 views
7

Sử dụng hoàn suggester Elasticsearch Tôi có vấn đề trở về lời đề nghị đầu vào nhiều từ phù hợp với truy vấn một từ.Elasticsearch hoàn thành đề nghị tìm kiếm với đầu vào nhiều chữ

Ví dụ cấu trúc:

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

truy vấn làm việc:

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

với kết quả

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

Không truy vấn:

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

với kết quả

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

Tôi mong chờ những kết quả tương tự như truy vấn lao động, phù hợp với 'chó mèo'. Bất kỳ đề xuất nào là vấn đề và cách làm cho truy vấn không hoạt động? Tôi nhận được kết quả tương tự khi sử dụng máy phân tích tiêu chuẩn thay vì bộ phân tích khoảng trắng. Tôi muốn sử dụng nhiều từ cho mỗi chuỗi đầu vào như được hiển thị trong ví dụ ở trên.

Trả lời

10

Đề xuất hoàn thành là prefix suggester, có nghĩa là nó cố gắng kết hợp truy vấn của bạn với một vài ký tự đầu tiên của các yếu tố đầu vào được cung cấp. Nếu bạn muốn tài liệu bạn đăng để khớp với văn bản "con chó", thì bạn sẽ cần phải chỉ định "con chó" làm đầu vào.

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

Theo kinh nghiệm của tôi, giới hạn về việc phải chỉ định các yếu tố đầu vào để thực hiện khớp tiền tố. Tôi thích edge ngrams cho mục đích này. Gần đây tôi đã viết một bài viết trên blog về việc sử dụng ngrams mà bạn có thể thấy hữu ích: http://blog.qbox.io/an-introduction-to-ngrams-in-elasticsearch

Như một ví dụ nhanh, đây là một bản đồ bạn có thể sử dụng

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

sau đó chỉ số doc như thế này:

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

và bất kỳ các truy vấn này sẽ trả lại nó:

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

cô e là mã tất cả cùng nhau:

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

+2

tìm kiếm + Truy vấn không trở về văn bản và trong trường hợp văn bản của tôi có thể được bất cứ điều gì trong ba lĩnh vực, vậy làm thế nào tôi có thể hiển thị văn bản chính xác trong autocomplete. –

Các vấn đề liên quan