2013-07-22 21 views
8

Khi tôi cố gắng tìm kiếm một cái gì đó như "workaround/sửa chữa" trong Lucene, nó throws lỗi này:Lucene queryparser với "/" trong truy vấn tiêu chí

org.apache.lucene.queryparser.classic.ParseException: Cannot parse 'workaround/fix': Lexical error at line 1, column 15. Encountered: <EOF> after : "/fix" 
    at org.apache.lucene.queryparser.classic.QueryParserBase.parse(QueryParserBase.java:131) 
    at pi.lucengine.LucIndex.main(LucIndex.java:112) 
Caused by: org.apache.lucene.queryparser.classic.TokenMgrError: Lexical error at line 1, column 15. Encountered: <EOF> after : "/fix" 
    at org.apache.lucene.queryparser.classic.QueryParserTokenManager.getNextToken(QueryParserTokenManager.java:1133) 
    at org.apache.lucene.queryparser.classic.QueryParser.jj_scan_token(QueryParser.java:599) 
    at org.apache.lucene.queryparser.classic.QueryParser.jj_3R_2(QueryParser.java:482) 
    at org.apache.lucene.queryparser.classic.QueryParser.jj_3_1(QueryParser.java:489) 
    at org.apache.lucene.queryparser.classic.QueryParser.jj_2_1(QueryParser.java:475) 
    at org.apache.lucene.queryparser.classic.QueryParser.Clause(QueryParser.java:226) 
    at org.apache.lucene.queryparser.classic.QueryParser.Query(QueryParser.java:181) 
    at org.apache.lucene.queryparser.classic.QueryParser.TopLevelQuery(QueryParser.java:170) 
    at org.apache.lucene.queryparser.classic.QueryParserBase.parse(QueryParserBase.java:121) 

Đây là những dòng tôi 111 và 112:

QueryParser parser = new QueryParser(Version.LUCENE_43, field, analyzer); 
Query query = parser.parse(newLine); 

Tôi cần làm gì để cho phép phân tích cú pháp "/"?

Trả lời

14

Trình phân tích truy vấn diễn giải các dấu gạch chéo làm đầu/cuối hoặc truy vấn regex (tính đến 4.0, xem documentation here).

Vì vậy, để kết hợp các dấu gạch chéo vào truy vấn, bạn cần phải escape them bằng cách thêm dấu gạch chéo ngược (\) trước chúng.

Bạn có thể xử lý thoát bằng QueryParser.escape(String).

2

Tôi gặp sự cố tương tự khi sử dụng '/' trong truy vấn lucene được phát hành từ bảng điều khiển tìm kiếm đàn hồi kibana. Tôi đã thoát khỏi các ký tự '/' như được chỉ ra trong tài liệu và vẫn không nhận được bất kỳ thành công nào. Tôi nghĩ rằng điều này liên quan đến lỗi mẫu được báo cáo tại đây: https://github.com/elastic/kibana/issues/789. Bạn không chắc chắn nào, sẽ cập nhật khi chúng tôi cập nhật các thành phần logstash

0

Tôi đã có một trường hợp khi sử dụng dấu gạch chéo với wildcard nó chỉ sẽ không trả về kết quả nào, ngay cả khi thoát khỏi nó:

+(*16/17*) 
+(*16\/17*) 

Giải pháp là để thêm dấu ngoặc kép:

+("*16/17*") 
+("*16\/17*")