Подтвердить что ты не робот

Как заставить Lucene отвечать на все слова в запросе?

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

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

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

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

4b9b3361

Ответ 1

Это похоже на вопрос Поиск Lucent 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

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

Ответ 3

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

Ответ 4

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

Ответ 5

Поведение жестко закодировано в метод 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");

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