2013-08-23 26 views
8

Có cách nào để tìm hiểu thông qua API elasticsearch cách một số thực tế được phân tích cú pháp? query string query? Bạn có thể làm điều đó theo cách thủ công bằng cách nhìn vào lucene query syntax, nhưng nó sẽ thực sự tốt đẹp nếu bạn có thể xem xét một số đại diện của các kết quả thực tế mà trình phân tích cú pháp có.Làm thế nào để tìm ra kết quả của elasticsearch phân tích cú pháp query_string?

+1

Bạn đã thử bật đầu ra giải thích bằng cách thêm giải thích = true vào yêu cầu tìm kiếm của mình chưa? – javanna

+1

@javanna Vì mục đích giải thích = true chỉ là để giải thích đánh giá của từng kết quả, giúp một chút để đoán những gì đang xảy ra. Nhưng tôi muốn một cái gì đó rõ ràng, đặc biệt là cho các trường hợp phức tạp. –

+1

Phải, hãy xem [xác thực truy vấn api] (http://www.elasticsearch.org/guide/reference/api/validate/) sau đó, và sử dụng giải thích ở đó, nên tốt hơn. – javanna

Trả lời

5

Như javanna được đề cập trong nhận xét có _validate api. Dưới đây là những gì hoạt động trên đàn hồi cục bộ của tôi (phiên bản 1.6):

curl -XGET 'http://localhost:9201/pl/_validate/query?explain&pretty' -d' 
{ 
    "query": { 
     "query_string": { 
     "query": "a OR (b AND c) OR (d AND NOT(e or f))", 
     "default_field": "t" 
    } 
    } 
} 
' 

pl là tên chỉ mục trên cụm của tôi. Chỉ mục khác nhau có thể có các trình phân tích khác nhau, đó là lý do tại sao xác thực truy vấn được thực thi trong phạm vi chỉ mục.

Kết quả của curl trên là như sau:

{ 
    "valid" : true, 
    "_shards" : { 
    "total" : 1, 
    "successful" : 1, 
    "failed" : 0 
    }, 
    "explanations" : [ { 
    "index" : "pl", 
    "valid" : true, 
    "explanation" : "filtered(t:a (+t:b +t:c) (+t:d -(t:e t:or t:f)))->cache([email protected]f1)" 
    } ] 
} 

tôi đã thực hiện một OR chữ thường về mục đích và như bạn có thể nhìn thấy trong lời giải thích, nó được xem như là một mã thông báo và không phải là một nhà điều hành.

Để giải thích về giải thích. Định dạng tương tự như +-operators của query string truy vấn:

  • (và) ký tự bắt đầu và kết thúc bool query
  • + tiền tố có nghĩa là điều khoản đó sẽ được ở must
  • - tiền tố có nghĩa là điều khoản đó sẽ được ở must_not
  • không có tiền tố có nghĩa là nó sẽ ở trong should (với default_operator bằng OR)
.210

Vì vậy, ở trên sẽ tương đương với sau:

{ 
    "bool" : { 
    "should" : [ 
     { 
     "term" : { "t" : "a" } 
     }, 
     { 
     "bool": { 
      "must": [ 
      { 
       "term" : { "t" : "b" } 
      }, 
      { 
       "term" : { "t" : "c" } 
      } 
      ] 
     } 
     }, 
     { 
     "bool": { 
      "must": { 
       "term" : { "t" : "d" } 
      }, 
      "must_not": { 
      "bool": { 
       "should": [ 
       { 
        "term" : { "t" : "e" } 
       }, 
       { 
        "term" : { "t" : "or" } 
       }, 
       { 
        "term" : { "t" : "f" } 
       } 
       ] 
      } 
      } 
     } 
     } 
    ] 
    } 
} 

tôi đã sử dụng _validate api khá nặng nề để gỡ lỗi phức tạp filtered truy vấn với nhiều điều kiện. Nó đặc biệt hữu ích nếu bạn muốn kiểm tra cách phân tích đầu vào được phân tích như một url hoặc nếu một số bộ lọc được lưu trong bộ nhớ cache.

Ngoài ra còn có một tham số tuyệt vời rewrite mà tôi không biết cho đến bây giờ, điều này làm cho giải thích thậm chí còn chi tiết hơn khi hiển thị truy vấn Lucene thực tế sẽ được thực thi.

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