Как заставить Lucene соответствовать всем словам в запросе? - PullRequest
14 голосов
/ 16 января 2009

Я использую Lucene, чтобы позволить пользователю искать слова в большом количестве документов. По умолчанию Lucene возвращает все документы, содержащие любое из введенных слов.

Можно ли изменить это поведение? Я знаю, что «+» можно использовать для включения термина, но я бы хотел сделать это действием по умолчанию.

В идеале хотелось бы, чтобы функциональность, аналогичная функции Google: '-', исключала слова и "abc xyz" для группировки слов.

Просто чтобы уточнить Я также подумал о вставке «+» во все пробелы в запросе. Я просто хотел избежать обнаружения сгруппированных терминов (квадратные скобки, кавычки и т. Д.) И возможного нарушения запроса. Есть ли другой подход?

Ответы [ 5 ]

30 голосов
/ 27 января 2009

Это похоже на вопрос Lucene Sentence Search . Если вам интересно, вот как я ответил на этот вопрос:

String defaultField = ...;
Analyzer analyzer = ...;
QueryParser queryParser = new QueryParser(defaultField, analyzer);

queryParser.setDefaultOperator(QueryParser.Operator.AND);

Query query = queryParser.parse("Searching is fun");
2 голосов
/ 29 января 2009

Как и Адам сказал, что ничего не нужно делать со строкой запроса. QueryParser setDefaultOperator делает именно то, что вы просите.

0 голосов
/ 16 января 2009

Lucene имеет обширный язык запросов, как описано здесь , который описывает все, что вы хотите, за исключением того, что по умолчанию используется +, но это то, что вы можете легко обработать, заменив пробелы на +. Таким образом, единственное, что вам нужно сделать, это определить формат, в который вы хотите, чтобы люди вводили свои поисковые запросы (я бы настоятельно рекомендовал придерживаться синтаксиса Lucene по умолчанию), а затем вы можете записать преобразования из вашего собственного синтаксиса в синтаксис Lucene.

0 голосов
/ 17 января 2009

Поведение жестко запрограммировано в методе addClause (List, int, int, Query) класса org.apache.lucene.queryParser.QueryParser , поэтому единственный способ изменить поведение (кроме Обходные пути выше), чтобы изменить этот метод. Конец метода выглядит так:

if (required && !prohibited)
  clauses.addElement(new BooleanClause(q, BooleanClause.Occur.MUST));
else if (!required && !prohibited)
  clauses.addElement(new BooleanClause(q, BooleanClause.Occur.SHOULD));
else if (!required && prohibited)
  clauses.addElement(new BooleanClause(q, BooleanClause.Occur.MUST_NOT));
else
  throw new RuntimeException("Clause cannot be both required and prohibited");

Если изменить «СЛЕДУЕТ» на «ДОЛЖЕН», то по умолчанию должны появиться предложения (например, слова).

0 голосов
/ 16 января 2009

Почему бы просто не подготовить пользовательский поисковый ввод и настроить его в соответствии с вашими критериями, используя синтаксис запроса Lucene , прежде чем передавать его в Lucene. В качестве альтернативы вы можете просто создать справочную документацию о том, как использовать стандартный синтаксис для создания конкретного запроса, и позволить пользователю решать, как должен выполняться запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...