Ответ 1
Есть 3 способа сделать это.
Первый способ - создать запрос вручную, это то, что QueryParser
делает внутренне. Это самый мощный способ сделать это и означает, что вам не нужно анализировать ввод пользователя, если вы хотите предотвратить доступ к некоторым более экзотическим функциям QueryParser
:
IndexReader reader = IndexReader.Open("<lucene dir>");
Searcher searcher = new IndexSearcher(reader);
BooleanQuery booleanQuery = new BooleanQuery();
Query query1 = new TermQuery(new Term("filename", "<text>"));
Query query2 = new TermQuery(new Term("filetext", "<text>"));
booleanQuery.add(query1, BooleanClause.Occur.SHOULD);
booleanQuery.add(query2, BooleanClause.Occur.SHOULD);
// Use BooleanClause.Occur.MUST instead of BooleanClause.Occur.SHOULD
// for AND queries
Hits hits = searcher.Search(booleanQuery);
Второй способ - использовать MultiFieldQueryParser
, это ведет себя как QueryParser
, что позволяет получить доступ ко всей мощности, которой он обладает, за исключением того, что он будет выполнять поиск по нескольким полям.
IndexReader reader = IndexReader.Open("<lucene dir>");
Searcher searcher = new IndexSearcher(reader);
Analyzer analyzer = new StandardAnalyzer();
MultiFieldQueryParser queryParser = new MultiFieldQueryParser(
new string[] {"filename", "filetext"},
analyzer);
Hits hits = searcher.Search(queryParser.parse("<text>"));
Последний способ - использовать специальный синтаксис QueryParser
здесь.
IndexReader reader = IndexReader.Open("<lucene dir>");
Searcher searcher = new IndexSearcher(reader);
Analyzer analyzer = new StandardAnalyzer();
QueryParser queryParser = new QueryParser("<default field>", analyzer);
// <default field> is the field that QueryParser will search if you don't
// prefix it with a field.
string special = "filename:" + text + " OR filetext:" + text;
Hits hits = searcher.Search(queryParser.parse(special));
Другой вариант - создать новое поле, когда вы индексируете свой контент с именем filenameandtext, в который вы можете поместить содержимое как имени файла, так и файла, тогда вам нужно только искать одно поле.