2012-04-10 21 views
10

Tôi đang sử dụng Điều khoản của Facet để nhận tất cả các giá trị duy nhất và số lượng của chúng cho một trường. Và tôi nhận được kết quả sai.Cách ngăn các Điều khoản của Facet khỏi mã hóa

term: web 
Count: 1191979 
term: misc 
Count: 1191979 
term: passwd 
Count: 1191979 
term: etc 
Count: 1191979 

Trong khi kết quả thực tế nên là:

term: WEB-MISC /etc/passwd 
Count: 1191979 

Đây là truy vấn mẫu của tôi:

{ 
    "facets": { 
    "terms1": { 
     "terms": { 
     "field": "message" 
     } 
    } 
    } 
} 
+0

bạn có thể cập nhật các câu hỏi với một ví dụ _short_ của dữ liệu và một ví dụ _short_ của truy vấn mà bạn đang làm, do đó, nó cung cấp thông tin hơn cho người dùng đến đây từ Tìm kiếm của Google, v.v ...? – karmi

Trả lời

16

Nếu reindexing là một lựa chọn, nó sẽ là tốt nhất để thay đổi lập bản đồ và đánh dấu các trường này là not_analyzed

"your_field" : { "type": "string", "index" : "not_analyzed" } 

Bạn có thể sử dụng multi field type nếu giữ một phiên bản phân tích của lĩnh vực này là mong muốn:

"your_field" : { 
    "type" : "multi_field", 
    "fields" : { 
     "your_field" : {"type" : "string", "index" : "analyzed"}, 
     "untouched" : {"type" : "string", "index" : "not_analyzed"} 
    } 
} 

Bằng cách này, bạn có thể tiếp tục sử dụng your_field trong các truy vấn, trong khi chạy tìm kiếm khía cạnh sử dụng your_field.untouched.

Ngoài ra, nếu lĩnh vực này được lưu trữ, bạn có thể sử dụng một khía cạnh lĩnh vực kịch bản thay vì:

"facets" : { 
    "term" : { 
    "terms" : { 
     "script_field" : "_fields.your_field.value" 
    } 
    } 
} 

Là phương sách cuối cùng, nếu lĩnh vực này không được lưu trữ, nhưng nguồn thu âm được lưu trữ trong chỉ mục, bạn có thể thử điều này:

"facets" : { 
    "term" : { 
    "terms" : { 
     "script_field" : "_source.your_field" 
    } 
    } 
} 

Giải pháp đầu tiên là hiệu quả nhất. Giải pháp cuối cùng là ít hiệu quả nhất và có thể mất rất nhiều thời gian trên một chỉ mục lớn.

+0

Tôi đã thử script_field nhưng dường như nó tạo ra lỗi. Truy vấn hiện tại của tôi trông như thế này mặc dù: http://www.pastebin.com/XwJMM7Eq – jmnwong

+0

Nó, có thể, cung cấp cho bạn "tài sản chưa được giải quyết của định danh: logsource" lỗi. Đó là bởi vì kịch bản elasticsearch không biết 'logource' có nghĩa là gì. Hãy thử thay thế bằng _fields.logsource – imotov

+0

Hiển thị dưới dạng "thuật ngữ" "[email protected]" – jmnwong

-1

Tôi đã giải thích ngắn gọn vấn đề này và đề xuất hai giải pháp here. Tôi đã nói về nhiều cách tiếp cận ở đây. Một là sử dụng not_analyzed để bảo tồn chuỗi như nó được. Nhưng sau đó vì nó có nhược điểm là không phân biệt chữ hoa chữ thường, nên cách tiếp cận tốt hơn sẽ là sử dụng từ khóa tokenizer + bộ lọc chữ thường

+0

Trong khi liên kết này có thể trả lời câu hỏi, tốt hơn nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. – Leigh

+0

Tôi đã trình bày câu trả lời của mình. –

0

Ồ, tôi cũng gặp vấn đề tương tự hôm nay trong khi thuật ngữ tổng hợp trong tìm kiếm đàn hồi gần đây. Sau khi googling và một số hiểu biết một phần, tìm thấy cách lập chỉ mục geeky này hoạt động (rất đơn giản).

Truy vấn có thể chỉ tìm thấy thuật ngữ thực sự tồn tại trong chỉ số đảo ngược

Khi bạn chỉ số chuỗi sau

"WEB-MISC /etc/passwd" 

nó sẽ được chuyển đến một máy phân tích. Máy phân tích có thể mã hóa nó vào

"WEB", "MISC", "etc" and "passwd" 

với chi tiết vị trí của nó. Và mã thông báo này có thể được lọc thành chữ thường như

"web", "misc", "etc" and "passwd" 

Vì vậy, sau khi lập chỉ mục, truy vấn tìm kiếm chỉ có thể thấy ở trên 4. không phải từ hoàn chỉnh "WEB-MISC/etc/passwd".Đối với yêu cầu của bạn sau đây là lựa chọn của tôi, bạn có thể sử dụng

1.Change the Default Analyzer used by elasticsearch([link][1]) 
2.If it is not need, just TurnOff the analyzer by setting 'not_analyzed' for the fields you need 
3.To convert the already indexed data searchable, re-indexing is the only option 
Các vấn đề liên quan