2014-12-04 15 views
7

Tôi có một trường trong Elasticsearch với giá trị "PEI.H.02354.01.". Khi tôi tìm kiếm với querystringTìm kiếm Elasticsearch không thành công trong trường có ký tự đặc biệt và ký tự đại diện

{ 
    "query":{ 
     "query_string":{ 
     "query":"field:PEI.H.02354.01.", 
     "default_operator":"AND" 
     } 
    } 
} 

thì kết quả được trả lại, đó là hành vi đúng. Nhưng nếu tôi tìm kiếm bằng ký tự đại diện, thì không có kết quả nào được trả về, ví dụ:

{ 
    "query":{ 
     "query_string":{ 
     "query":"field:PEI.H.02354.01.*", 
     "default_operator":"AND" 
     } 
    } 
} 

Trường là chuỗi loại và được phân tích. Dưới đây là mã tạo chỉ mục, bao gồm cả trình phân tích và ánh xạ.

{ 
    "settings":{ 
     "analysis":{ 
     "analyzer":{ 
      "number":{ 
       "type":"custom", 
       "tokenizer":"keyword", 
       "filter":[ 
        "lowercase" 
       ], 
       "char_filter":[ 
        "number_filter" 
       ] 
      }, 
      "diacritical":{ 
       "type":"custom", 
       "tokenizer":"standard", 
       "filter":[ 
        "standard", 
        "lowercase", 
        "asciifolding", 
        "nfd_normalizer" 
       ] 
      } 
     }, 
     "filter":{ 
      "nfd_normalizer":{ 
       "type":"icu_normalizer", 
       "name":"nfc" 
      } 
     }, 
     "char_filter":{ 
      "number_filter":{ 
       "type":"pattern_replace", 
       "pattern":"[^\\d]+", 
       "replacement":"" 
      } 
     } 
     } 
    }, 
    "mappings":{ 
     "testType":{ 
     "_source":{ 
      "enabled":false 
     }, 
     "_all":{ 
      "enabled":false 
     }, 
     "_timestamp":{ 
      "enabled":"true", 
      "store":"yes" 
     }, 
     "properties":{ 
      "field":{ 
       "store":"yes", 
       "type":"string", 
       "index":"analyzed", 
       "analyzer":"diacritical" 
      } 
     } 
    }  
} 

Cuối cùng, một chèn mẫu là

{ 
    field: "PEI.H.02354.01." 
} 

Có ai có bất kỳ ý tưởng tại sao điều này đang xảy ra và làm thế nào để giải quyết này?

Trả lời

8

Xem tài liệu query_string:

về wildcarded không phân tích theo mặc định - họ đang lowercased (lowercase_expanded_terms giá trị mặc định là true) nhưng không có phân tích sâu hơn được thực hiện

dữ liệu lưu trữ của bạn được chia thành hai nhiệm kỳ:

curl -XGET 'localhost:9200/myindex/_analyze?analyzer=diacritical&pretty' -d 'PEI.H.02354.01' 
{ 
    "tokens" : [ { 
    "token" : "pei.h", 
    "start_offset" : 0, 
    "end_offset" : 5, 
    "type" : "<ALPHANUM>", 
    "position" : 1 
    }, { 
    "token" : "02354.01", 
    "start_offset" : 6, 
    "end_offset" : 14, 
    "type" : "<NUM>", 
    "position" : 2 
    } ] 
} 

nhưng như thuật ngữ tìm kiếm của bạn với một ký tự đại diện chỉ được biến thành pei.h.02354.01.* nó sẽ không phù hợp.

tuy nhiên với analyze_wildcard thiết lập để đúng, bạn nhận được lượt truy cập:

curl -XGET "http://localhost:9200/myindex/testType/_search?pretty" -d' 
> { 
> "query":{ 
>  "query_string":{ 
>   "query":"field:PEI.H.02354.01.*", 
>   "default_operator":"AND", 
>   "analyze_wildcard": true 
>  } 
> } 
> }' 
{ 
    "took" : 5, 
    "timed_out" : false, 
    "_shards" : { 
    "total" : 5, 
    "successful" : 5, 
    "failed" : 0 
    }, 
    "hits" : { 
    "total" : 2, 
    "max_score" : 1.4142135, 
+0

Sử dụng này thực sự trả về kết quả, nhưng không phải tất cả trong số họ là chính xác, ví dụ Tôi cũng nhận được PEI.H.4545.01. Điều này có ý nghĩa nếu như bạn nói, cụm từ tìm kiếm được phân tích và về cơ bản những gì ES tìm kiếm là pei.h HOẶC 02354.01. Nhưng có cách nào để tránh điều này và tìm kiếm PEI.H.02354.01. như một tổng số, thay vì phá vỡ nó trong hai nhiệm kỳ? – dchar

+0

Có vẻ như bạn muốn coi PEI.H.02354.01 là một chuỗi đơn - nếu bạn cần thay đổi máy phân tích của mình, ví dụ: để chỉ thông báo trên không gian. –

+0

Có thể đối với loại tìm kiếm này, bạn nên sử dụng nhiều trường với một trình phân tích khác. –

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