2010-01-05 13 views
53

Czytam How to incorporate multiple fields in QueryParser?, ale nie dostałem.Jak określić dwa pola w Lucene QueryParser?

W tej chwili mam bardzo dziwną budowę takiego:

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

Co mogę zrobić coś podobnego:

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

więc parser wyszukuje słowo wyszukiwania w polu „bodytext tytuł "w polu".

Odpowiedz

135

Dostępne są 3 sposoby.

Pierwszy sposób polega na ręcznym utworzeniu zapytania, co robi wewnętrznie QueryParser. To jest najbardziej skutecznym sposobem, aby to zrobić, a to oznacza, że ​​nie masz do analizowania danych wprowadzonych przez użytkownika, jeśli chcesz, aby uniemożliwić dostęp do niektórych bardziej egzotycznych cech 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); 

Drugim sposobem jest aby użyć MultiFieldQueryParser, zachowuje się to jak QueryParser, umożliwiając dostęp do całej posiadanej mocy, z tym wyjątkiem, że przeszuka wiele pól.

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>")); 

Ostatnim sposobem jest użycie specjalnej składni 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)); 

Twój Inną opcją jest stworzenie nowego pola, gdy wskaźnik treść nazywa bodytextandtitle, w którym można umieścić zawartość zarówno bodytext i tytuł, a potem trzeba tylko poszukać jedno pole.