2015-02-21 22 views
5

Tôi có một truy vấn multi_match loại cross_fields, mà tôi muốn cải thiện với kết hợp tiền tố.Tìm kiếm Đàn hồi multi_match cross_fields prefix

{ 
    "index": "companies", 
    "size": 25, 
    "from": 0, 
    "body": { 
    "_source": { 
     "include": [ 
     "name", 
     "address" 
     ] 
    }, 
    "query": { 
     "filtered": { 
     "query": { 
      "multi_match": { 
      "type": "cross_fields", 
      "query": "Google", 
      "operator": "and", 
      "fields": [ 
       "name", 
       "address" 
      ] 
      } 
     } 
     } 
    } 
    } 
} 

Kết hợp hoàn toàn với các truy vấn như google mountain view. Mảng filtered có ở đó vì tôi cần phải thêm các bộ lọc địa lý.

{ 
    "id": 1, 
    "name": "Google", 
    "address": "Mountain View" 
} 

Bây giờ tôi muốn cho phép khớp tiền tố mà không vi phạm cross_fields.

Queries như thế này phải phù hợp:

  • goog
  • google mount
  • google mountain vi
  • mountain view goo

Nếu tôi thay đổi multi_match.type-phrase_prefix, nó phù hợp với toàn bộ truy vấn đối một trường duy nhất, do đó, nó chỉ đối sánh với mountain vi nhưng không khớp với google mountain vi

Làm cách nào để giải quyết vấn đề này?

Trả lời

2

Vì không có câu trả lời và ai đó có thể thấy điều này, tôi đã có cùng một vấn đề và đây là một giải pháp:

Sử dụng the edgeNGrams tokenizer.

Bạn cần thay đổi cài đặt chỉ mục và ánh xạ.

Dưới đây là một ví dụ cho các cài đặt:

"settings" : { 
    "index" : { 
    "analysis" : { 
     "analyzer" : { 
     "ngram_analyzer" : { 
      "type" : "custom", 
      "stopwords" : "_none_", 
      "filter" : [ "standard", "lowercase", "asciifolding", "word_delimiter", "no_stop", "ngram_filter" ], 
      "tokenizer" : "standard" 
     }, 
     "default" : { 
      "type" : "custom", 
      "stopwords" : "_none_", 
      "filter" : [ "standard", "lowercase", "asciifolding", "word_delimiter", "no_stop" ], 
      "tokenizer" : "standard" 
     } 
     }, 
     "filter" : { 
     "no_stop" : { 
      "type" : "stop", 
      "stopwords" : "_none_" 
     }, 
     "ngram_filter" : { 
      "type" : "edgeNGram", 
      "min_gram" : "2", 
      "max_gram" : "20" 
     } 
     } 
    } 
    } 
} 

Tất nhiên, bạn nên thích ứng với các phân tích đối với trường hợp sử dụng của riêng bạn. Bạn có thể muốn để phân tích mặc định bị ảnh hưởng hoặc thêm bộ lọc ngram vào nó để bạn không phải thay đổi ánh xạ. Giải pháp cuối cùng đó có nghĩa là tất cả các trường trong chỉ mục của bạn sẽ nhận được bộ lọc ngram.

Và đối với các bản đồ:

"mappings" : { 
    "patient" : { 
    "properties" : { 
     "name" : { 
     "type" : "string", 
     "analyzer" : "ngram_analyzer" 
     }, 
     "address" : { 
     "type" : "string", 
     "analyzer" : "ngram_analyzer" 
     } 
    } 
    } 
} 

Declare mọi lĩnh vực bạn muốn tự động hoàn thành với ngram_analyzer. Sau đó, các truy vấn trong câu hỏi của bạn sẽ hoạt động. Nếu bạn sử dụng cái gì khác, tôi rất vui khi được nghe về nó.

+0

Rất hữu ích cho những gì tôi muốn, cảm ơn. – Abubakkar

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