2009-08-13 7 views
3

Sagen Sie meine AnforderungWie filtere ich meine Lucene Suchergebnisse?

"search for all users by name, who are over 18" 

ist, wenn ich SQL verwendet haben, ich so etwas wie schreiben könnte:

Select * from [Users] 
Where ([firstname] like '%' + @searchTerm + '%' OR 
     [lastname] like '%' + @searchTerm + '%') 
    AND [age] >= 18 

jedoch im Schwierigkeiten übersetzen diese in lucene.net.

Dies ist, was ich bisher:

var parser = new MultiFieldQueryParser({ "firstname", "lastname"}, new StandardAnalyser()); 
var luceneQuery = parser.Parse(searchterm) 

var query = FullTextSession.CreateFullTextQuery(luceneQuery, typeof(User)); 

var results = query.List<User>(); 

Wie füge ich in dem "wo Alter> = 18" Bit?

Ich habe über .SetFilter() gehört, aber dies akzeptiert nur LuceneQueries und nicht IQueries. Wenn SetFilter die richtige Anwendung ist, wie mache ich den passenden Filter? Wenn nicht, was verwende ich und wie mache ich das?

Danke!

P.S. Dies ist eine stark vereinfachte Version dessen, was ich versuche, um Klarheit zu schaffen, meine WHERE Klausel ist tatsächlich viel komplizierter als hier gezeigt. In Wirklichkeit muss ich prüfen, ob in Unterabfragen ids vorhanden sind und eine Reihe von nicht indizierten Eigenschaften überprüfen. Alle Lösungen müssen dies unterstützen.

Dank

Antwort

1

Am Ende habe ich NHibernate.Search entfernt und einfach direkt mit Lucene gesprochen, um die IDs zu bekommen, dann diese in eine HQL Where-Klausel, viel einfacher und effizienter.

Edit: Es gibt eine Einschränkung in NH.Search, die verhindert, dass dies funktioniert. Es kann einfach gepatcht werden, aber sobald Sie den NH.S-Code gelesen haben, erkennen Sie, wie furchtbar ineffizient es ist. Es ist die beste Option, direkt nach Lucene zu fahren.

1

ein QueryWrapperFilter verwenden.

+0

Können Sie ein Beispiel geben? In Lucene.Net akzeptiert QueryFilter nur LunceneQueries, nicht Nhib-Abfragen. Wie erstelle ich die Abfrage (möglichst generisch, nicht nur für Alter> = 18)? Vielen Dank –

2

Für das Alter Feld, das Sie ein range search benötigen, in der Syntax von Lucene etwas geschrieben wie:

age:[18 TO 100] 

Als Gandalf sagte, können Sie ein QueryWrapperFilter verwenden. Ich bin mir nicht sicher, ob das in Nhibernate Search existiert. In ähnlicher Weise können Sie "AND" verwenden, um Ihre Abfrage weiter einzuschränken. Ich bin mir nicht sicher, was Sie gegen nicht indexierte Eigenschaften tun können.