Как указать два поля в Lucene QueryParser? - PullRequest
61 голосов
/ 05 января 2010

Я прочитал Как включить несколько полей в QueryParser? , но я не получил его.

На данный момент у меня очень странная конструкция вроде:

parser = New QueryParser("bodytext", analyzer)
parser2 = New QueryParser("title", analyzer)
query = parser.Parse(strSuchbegriff)
query2 = parser.Parse(strSuchbegriff)

Что я могу сделать для чего-то вроде:

parser = New QuerParser ("bodytext" , "title",analyzer)
query =parser.Parse(strSuchbegriff) 

, поэтому анализатор ищет искомое слово в поле «bodytext» и в поле «title».

1 Ответ

147 голосов
/ 10 января 2010

Есть 3 способа сделать это.

Первый способ - создать запрос вручную, это то, что QueryParser делает внутри. Это самый эффективный способ сделать это и означает, что вам не нужно анализировать пользовательский ввод, если вы хотите запретить доступ к некоторым из более экзотических функций QueryParser:

IndexReader reader = IndexReader.Open("<lucene dir>");
Searcher searcher = new IndexSearcher(reader);

BooleanQuery booleanQuery = new BooleanQuery();
Query query1 = new TermQuery(new Term("bodytext", "<text>"));
Query query2 = new TermQuery(new Term("title", "<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[] {"bodytext", "title"},
                                        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 = "bodytext:" + text + " OR title:" + text;

Hits hits = searcher.Search(queryParser.parse(special));

Другой вариант - создать новое поле при индексации содержимого, называемого bodytextandtitle, в которое вы можете поместить содержимое и bodytext и title, тогда вам придется искать только одно поле.

...