2015-08-12 17 views
5

Tôi đang thực hiện tìm kiếm chung chống lại elasticsearch (1.7) và tất cả cũng ngoại trừ số tài khoản của tôi có dấu gạch chéo chuyển tiếp trong chúng. Trường số tài khoản không phải là trường id và là "not_analyzed".thoát khỏi dấu gạch chéo về phía trước trong elasticsearch

Nếu tôi thực hiện tìm kiếm trên một số tài khoản, ví dụ: AC/1234/A01 sau đó tôi nhận được hàng ngàn kết quả, có lẽ vì nó đang thực hiện tìm kiếm regex (?).

{ 
    "query" : { "query_string" : {"query" : "AC/1234/A01"} } 
} 

tôi có thể nhận được kết quả tôi muốn bằng cách thực hiện một tìm kiếm kết hợp chính xác

{ 
    "query" : { "query_string" : {"query" : "\"AC/1234/A01\""} } 
    } 

Điều này thực sự mang lại cho tôi kết quả tôi muốn và có lẽ sẽ phù hợp với những hóa đơn như một tùy chọn sao lưu (xung quanh tất cả các 'đơn từ 'tìm kiếm có dấu ngoặc kép'. Tuy nhiên tôi nghĩ nếu họ thực hiện tìm kiếm nhiều từ bao gồm số tài khoản tôi sẽ quay lại hàng nghìn kết quả và mặc dù tôi không thể thấy giá trị của tìm kiếm đó tôi muốn tránh nó xảy ra.

Về cơ bản tôi có một ứng dụng java truy vấn tìm kiếm đàn hồi và tôi muốn thoát khỏi tất cả các dấu gạch chéo được nhập vào trong GUI.

My Googling đã nói với tôi rằng

{ 
    "query" : { "query_string" : {"query" : "AC\\/1234\\/A01"} } 
} 

ought để làm điều này nhưng nó làm cho không có sự khác biệt, các công trình truy vấn nhưng tôi vẫn nhận được hàng ngàn kết quả.

Có ai có thể chỉ cho tôi đúng hướng không?

+1

Tại sao bạn sử dụng 'query_string' ở đây? 'term' khớp với một thuật ngữ như nó. – Maroun

+0

Có một hộp nhập cho các cụm từ tìm kiếm có thể là một từ hoặc một câu, có hoặc không có toán tử boolean. Cơ bản nhất là truy vấn tất cả dữ liệu. Nó hoạt động tốt ngoại trừ /. Như tôi hiểu nó một truy vấn thuật ngữ chỉ có thể truy vấn một trường tại một thời điểm (và tôi sẽ phải phân tích cú pháp truy vấn đó để sử dụng truy vấn thuật ngữ mà tôi nghĩ)? Vui lòng sửa tôi nếu tôi sai! – gringogordo

+1

Sự khác biệt chính giữa truy vấn 'term' và' match' và 'query_string' là' term' không phân tích đầu vào. Bằng cách sử dụng truy vấn 'term', bạn có thể tìm kiếm một từ và bằng cách sử dụng' terms', bạn có thể thực hiện vài thuật ngữ cùng một lúc. Thích hợp nhất để tìm kiếm trên nhiều trường là 'multi_match' hoặc' query_string'. Tôi đã không kiểm tra nhưng tôi nghĩ rằng bạn cũng có thể sử dụng truy vấn 'term' với bí danh' _all' và "trick" 'terms' để xem xét nhiều hơn một cột cùng một lúc. – slawek

Trả lời

9

Bạn sẽ nhận được những gì bạn muốn mà không cần thoát ra bất cứ điều gì chỉ đơn giản bằng cách xác định một keyword analyzer cho chuỗi truy vấn, như thế này:

{ 
    "query" : { 
    "query_string" : { 
     "query" : "AC/1234/A01", 
     "analyzer": "keyword"   <---- add this line 
    } 
    } 
} 

Nếu bạn không làm điều này, máy phân tích tiêu chuẩn được sử dụng (và sẽ tokenize chuỗi truy vấn của bạn) bất kể loại trường của bạn là gì hay là not_analyzed hay không.

+0

Rất cám ơn, Điều này dường như phù hợp với hóa đơn. Tôi đoán tôi cần phải hiểu nó tốt hơn một chút trước khi tôi đưa nó vào sản xuất (nó ảnh hưởng đến booleans và kỹ thuật tìm kiếm tiên tiến hơn ... thời gian để làm nghiên cứu nhiều hơn nữa!) Nhưng điều đó có vẻ hoàn hảo. Cảm ơn rất nhiều. – gringogordo

+8

Điều này dường như không hoạt động trong ES mới nhất! –

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