2013-07-22 9 views
8

Kiedy staram się szukać czegoś takiego jak „obejść/naprawić” w Lucene, zgłasza ten błąd:Lucene queryparser z „/” w zapytaniu kryteriów

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) 

To są moje linie 111 i 112:

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

Co należy zrobić, aby umożliwić analizowanie "/"?

Odpowiedz

14

Analizator zapytań interpretuje ukośniki jako zapytanie początek/koniec lub wyrażenie regularne (od wersji 4.0, patrz documentation here).

Aby uwzględnić ukośniki w zapytaniu, musisz przed nim dodać odwrotny ukośnik().

Możesz obsługiwać wychodzenie z QueryParser.escape(String).

2

Z podobnym problemem spotkałem się przy użyciu "/" w zapytaniach luceńskich wydanych przez elastyczny panel wyszukiwania kibana. Uciekałem od znaków "/", jak wskazano w dokumentacji i nadal nie osiągałem żadnego sukcesu. Myślę, że jest to związane z zgłoszonym tu błędem szablonu: https://github.com/elastic/kibana/issues/789. Nie wiem jeszcze, kiedy będzie aktualizować zaktualizować komponenty logstash

0

miałem przypadek, w którym przy użyciu ukośnika z zamiennika to po prostu nie zwraca żadnych wyników, nawet jeśli uciekł go:

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

Rozwiązanie było dodanie podwójnego cytatu:

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