2009-01-22 4 views
34
Dim qp1 As New QueryParser("filename", New StandardAnalyzer()) 
Dim qp2 As New QueryParser("filetext", New StandardAnalyzer()) 
. 
. 

Ich verwende die 'Lucene.Net' Bibliothek und habe die folgende Frage.Wie mehrere Felder in QueryParser zu integrieren?

Statt zwei getrennte QueryParser Objekte zu erstellen und mit ihnen zwei Hits Objekte zu erhalten, ist es möglich, eine Suche auf beiden Feldern führt ein einzelnes QueryParser Objekt verwenden, so dass ich nur ein Treffer habe Objekt, das mir die Gesamtnote gibt jedes Dokument?

Antwort

1

für jedes Feld erstellen Sie eine Abfrage von den obigen Abfrageparsern, fügen Sie dann die Abfrage zu einer booleanquery, die besagt, dass es "auftreten muss".

Alternativ können Sie auch den MultiFieldQueryParser herunterladen. Dies ist eine vereinfachte Methode.

4

einfach einen Abfrage-String mit jedem Begriff bauen:

"filename:searchText OR filetext:searchText" 

Es spielt keine Rolle, was man als das Anfangsfeld passiert in QueryParser Konstruktor. Stellen Sie sicher, dass Sie .Parse() in Ihrer Abfragezeichenfolge aufrufen, um ein Abfrageobjekt zur Ausführung zurück zu bekommen.

Wenn Sie eine „und“ Suche verwenden möchten:

"+filename:searchText +filetext:searchText" 
77

Es gibt drei Möglichkeiten, dies zu tun.

Die erste Möglichkeit besteht darin, eine Abfrage manuell zu erstellen, was QueryParser intern tut. Dies ist der beste Weg, es zu tun, und bedeutet, dass Sie den Benutzer analysieren müssen Eingang nicht, wenn Sie den Zugriff auf einige der exotischen Eigenschaften von QueryParser verhindern wollen:

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

Der zweite Weg ist um MultiFieldQueryParser zu verwenden, verhält sich das wie QueryParser und ermöglicht den Zugriff auf die gesamte Leistung, außer dass es mehrere Felder durchsucht.

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

Der letzte Weg ist, die spezielle Syntax der QueryParsersee here zu verwenden.

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

Die andere Option ist neues Feld zu erstellen, wenn Sie Ihre Inhalte Index filenameandtext genannt, in dem Sie die Inhalte von sowohl Dateinamen und filetext zu platzieren, dann haben Sie nur ein Feld zu suchen.

+1

mit dem MultiFieldQueryParser helfen, wie die Abfrage sollte wie folgt aussehen? Können Sie ein Beispiel geben für "" in der Zeile 'queryParser.parse (" ")'? – alvas

+1

Wie erlaube ich Abfrage für verschiedene Felder mit dem MultiFieldQueryParser? Nehmen wir an, ich möchte nach 'filename: testfile.txt UND filetext fragen:" Singapore food "'. – alvas

2

** können Sie auch MultiFieldQueryParser verwenden in allen verfügbaren Feldern zu suchen. **

Z. B

Dim queryParser = New MultiFieldQueryParser(Version.LUCENE_29, 
indexReader__1.GetFieldNames(IndexReader.FieldOption.ALL).ToArray(), analyzer) 

hier vollständig ist ein Beispiel dafür.

//get index directory 
Dim directory As Directory = FSDirectory.Open(New DirectoryInfo(HostingEnvironment.MapPath(VirtualIndexPath))) 

//get analyzer 
Dim analyzer As Analyzer = New StandardAnalyzer(Version.LUCENE_29) 

//get index reader and searcher 
Dim indexReader__1 As IndexReader = IndexReader.Open(directory, True) 
Dim indexSearch As Searcher = New IndexSearcher(indexReader__1) 

//add all possible fileds in multifieldqueryparser using indexreader getFieldNames method 
Dim queryParser = New MultiFieldQueryParser(Version.LUCENE_29, indexReader__1.GetFieldNames(IndexReader.FieldOption.ALL).ToArray(), analyzer) 
Dim query = queryParser.Parse(Criteria) 
Dim resultDocs As TopDocs = Nothing 

//perform search 
resultDocs = indexSearch.Search(query, indexReader__1.MaxDoc()) 
Dim hits = resultDocs.scoreDocs 

Hoffnung, die