2014-11-13 14 views
8

Vì vậy, tôi có một lĩnh vực mà các cửa hàng một giá trị trong các định dạng: number/year, một cái gì đó giống như 23/2014, 24/2014, 12/2015, vv ...Làm cách nào để tạo các giá trị chính xác và truy vấn đối sánh trên cùng một trường trong elasticsearch?

vì vậy nếu lĩnh vực này được ánh xạ như một not_analyzed một, Tôi có thể thực hiện tìm kiếm giá trị chính xác với bộ lọc cụm từ, nếu tôi tìm kiếm giá trị trong cấu trúc chính xác đó (như tháng 1/2014, 15/2014, ...), nó hoạt động như sql equals(=).

{ 
    "query": { 
    "filtered": { 
     "filter": { 
     "term": { 
      "processNumber": "11/2014" 
     } 
     } 
    } 
    } 
} 

Vì vậy, tìm kiếm với thứ gì đó khác như 11/hoặc 2014 không trả về lần truy cập. Điều này là tốt.

Nhưng nếu tôi xác định trường là not_analyzed, tôi không thể thực hiện sql LIKE tìm kiếm loại với truy vấn match_phrase.

{ 
    "query": { 
    "match_phrase": { 
     "processNumber": "11/201" 
    } 
    } 
} 

Trong trường hợp này tìm kiếm 11,11 /,/2014 hoặc 2014 phải trả về số truy cập nhưng không. Vấn đề là truy vấn này hoạt động nếu trường không được ánh xạ dưới dạng not_analyzed. Vì vậy, có vẻ như tôi phải sử dụng một hoặc khác, vấn đề là lĩnh vực nên hỗ trợ cả hai tùy chọn cho các truy vấn khác nhau, tôi có thiếu cái gì ở đây?

Trả lời

14

Bạn có thể phân tích cùng một lĩnh vực processNumber theo những cách khác nhau bằng cách sử dụng fields bất động sản trong việc lập bản đồ:

Ví dụ, nếu bạn muốn phiên bản phân tích và không được phân tích của ProcessNumber ánh xạ sẽ là:

{ 
    "type_name": { 
     "properties": { 
     "processNumber": { 
      "type": "string", 
      "index": "not_analyzed", 
      "fields": { 
       "analyzed": { 
        "type": "string", 
        "index": "analyzed" 
       } 
      } 
     } 
     } 
    } 
} 

Trường không phân tích được tham chiếu trong truy vấn dưới dạng processNumber.

Để tham khảo quan điểm phân tích việc sử dụng lĩnh vực processNumber.analyzed

Các truy vấn với các điều kiện 11/201, 11 vv sẽ là:

Ví dụ Lọc:

{ "query" : { "filtered" : { "filter" : { "term" : { "processNumber" : "11/2014" } } } } } 

Bộ lọc cụm từ không phân tích chuỗi tìm kiếm sao cho đầu vào sẽ được so khớp với chỉ mục đảo ngược trong trường hợp này: 11/2014 so với trường.

Ví dụ Match_Phrase_prefix:

{ "query": { "match_phrase_prefix": { "processNumber": "11/201" } } } 

match_phrase_prefix cố gắng để kiểm tra xem hạn cuối cùng trong cụm từ là tiền tố của từ ngữ trong chỉ mục. Nó phân tích chuỗi tìm kiếm nếu một bộ phân tích được chỉ định. Đây là lý do bạn cần sử dụng phiên bản không được phân tích của trường tại đây. Nếu chúng tôi sử dụng processNumber.phân tích truy vấn tìm kiếm như 11-201, 11 | 201 sẽ cũng phù hợp

dụ trận đấu:

{ "query": { "match": { "processNumber.analyzed": "11" } } } 

Đây là thẳng về phía trước match từ phân tích mặc định (thường là tiêu chuẩn phân tích) sẽ tokenize 11/2014 đến điều khoản 11, 2014.

Bạn có thể sử dụng phân tích api để xem cách một văn bản cụ thể được phân tích theo trình phân tích mặc định.

curl -XPOST "http://<machine>/_analyze?text=11/2014" 
+0

Cảm ơn. Tôi hiện đang sử dụng tích hợp mùa xuân với elasticsearch và đây là cách trường được ánh xạ hiện tại: @Field (type = String, index = FieldIndex.not_analyzed) public String processNumber; Tôi không biết có cách nào để đặt thuộc tính trường tại đây hay không. – Maxrunner

+0

Ok tôi nghĩ tôi đã làm việc này: @MultiField ( mainField = @ Field (type = String, index = FieldIndex.not_analyzed), otherFields = @NestedField (dotSuffix = "analysis", type = String, index = FieldIndex.analyzed) ) Nhưng bạn có thể cho tôi biết sự khác biệt giữa tất cả ba truy vấn đối sánh không? – Maxrunner

+1

@Maxrunner đã chỉnh sửa câu trả lời để đưa ra giải thích ngắn gọn về các truy vấn. – keety

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