Я использую Apache Lucene 5.0.0 и столкнулся с проблемами при использовании QueryParser. Я попытался создать запрос, но получил исключение ParseException.
Вот мой код:
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
public class QueryTest {
public static void main(String[] args) {
QueryParser parser = new QueryParser("field", new StandardAnalyzer());
try {
parser.Query("query");
} catch (ParseException e) {
e.printStackTrace();
}
}
}
Это исключение, которое я получаю:
org.apache.lucene.queryparser.classic.ParseException: Encountered "<EOF>" at line 1, column 0.
Was expecting one of:
<NOT> ...
"+" ...
"-" ...
<BAREOPER> ...
"(" ...
"*" ...
<QUOTED> ...
<TERM> ...
<PREFIXTERM> ...
<WILDTERM> ...
<REGEXPTERM> ...
"[" ...
"{" ...
<NUMBER> ...
<TERM> ...
"*" ...
at org.apache.lucene.queryparser.classic.QueryParser.generateParseException(QueryParser.java:698)
at org.apache.lucene.queryparser.classic.QueryParser.jj_consume_token(QueryParser.java:580)
at org.apache.lucene.queryparser.classic.QueryParser.Clause(QueryParser.java:265)
at org.apache.lucene.queryparser.classic.QueryParser.Query(QueryParser.java:171)
at QueryTest.main(QueryTest.java:9)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Если это поможет, я добавил следующие файлы jar:
- Люцен-анализаторы-общий-5.0.0.jar
- lucene-core-5.0.0.jar
- lucene-запросы-5.0.0.jar
- lucene-queryparser-5.0.0.jar
- lucene-песочница-5.0.0.jar
Я понятия не имею, почему возникает это исключение и как его решить. Примеры в Интернете похожи, но, похоже, они отлично работают.
Спасибо.
2 ответа
Я думаю, вы просто используете неправильный метод, вы пытаетесь сделать следующее:
QueryParser parser = new QueryParser("field", new StandardAnalyzer());
try {
Query query = parser.parse("query"); // changed this line
} catch (ParseException e) {
e.printStackTrace();
}
Согласно документации:
Синтаксис строк запроса следующий: Запрос - это серия предложений. Предложение может иметь префикс:
- знак плюса (
+
) или минуса (-
), указывающий что данная оговорка требуется или запрещена соответственно; или - термин, за которым следует двоеточие, обозначающее поле для поиска. Это позволяет создавать запросы, выполняющие поиск по нескольким полям.
Пункт может быть:
- срок с указанием всех документов, содержащих этот термин; или же
- вложенный запрос, заключенный в круглые скобки. Обратите внимание, что это можно использовать с префиксом
+
/-
, чтобы требовать любой из набора термины.
Таким образом, в BNF грамматика запроса:
Query ::= ( Clause )* Clause ::= ["+", "-"] [<TERM> ":"] ( <TERM> | "(" Query ")" )
Дополнительную информацию см. Здесь - http : //lucene.apache.org/core/5_0_0/queryparser/org/apache/lucene/queryparser/classic/QueryParser.html
Чтобы решить вашу проблему, в частности, может быть стоит проанализировать строку "field: Query" как запрос
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.