2010-01-05 2 views
53

Я читал How to incorporate multiple fields in QueryParser?, но я не понял.Как указать два поля в Lucene 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) 

так Parser ищет поисковое слово в поле «Bodytext "в поле" title ".

ответ

135

Существует 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>")); 

Окончательный способ использовать специальный синтаксис QueryParsersee here.

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 и название, то вы только должны искать одно поле.