2012-04-10 7 views
2

In Solr, was ist die beste Möglichkeit der Abfrage über verschiedene Felder, in denen jede Abfrage für jedes Feld eine unterschiedliche Gewichtung hat?Abfragen über mehrere Felder mit unterschiedlichen Boosts in Solr

Wir verwenden C# und ASP.NET, wobei SolrNet zur Abfrage von Solr verwendet wird. Unser Index sieht ein bisschen wie folgt aus:

  • document_id
  • Titel
  • TEXT_CONTENT
  • Tags
  • [einige weitere Felder ...]

Diese wird dann abgefragt Schlüsselwörter , wobei jedes Keyword ein anderes Gewicht hat. So könnte beispielsweise "ipad" ein Gewicht von 40 haben, aber "android" könnte ein Gewicht von 25 haben.

In Verbindung damit hat jedes Feld ein anderes Basisgewicht. Zum Beispiel sind Keywords wertvoller als Seitentitel, die wertvoller sind als Textinhalte.

So beenden wir mit so etwas wie die folgenden auf:

  • Titel^25
  • TEXT_CONTENT^10
  • Tags^50

Und den folgenden Suchbegriffen:

  • ipad^25
  • Apfel^22
  • Microsoft^15
  • Fenster^15
  • Software^20
  • Computer^18

Also, jede Abfrage Suche hat eine andere Gewichtung, und jedes Feld hat eine unterschiedliches Gewicht. Als Ergebnis erhalten wir Suchkriterien, die wie folgt aussieht:

  • Titel: ipad^50
  • Titel: Apfel^47
  • Titel: Microsoft^40
  • [mehr Titel .. .]
  • TEXT_CONTENT: ipad^35
  • TEXT_CONTENT: Apfel^32
  • TEXT_CONTENT: Microsoft^25
  • [mehr viel ...]

Dies führt zu einer sehr, sehr langen Suchanfrage, die das erlaubte Limit überschreitet. Es scheint auch ein sehr ineffizienter Weg zu sein, und ich frage mich, ob es einen besseren Weg gibt, dies zu erreichen.

Effektiv haben wir eine Liste von Schlüsselwörtern mit unterschiedlichen Gewichten und eine Liste von Feldern in Solr, die auch unterschiedliche Gewichte haben, und die Idee ist, den Index abzufragen, um die relevantesten Dokumente abzurufen.

Noch komplizierter, obwohl es möglicherweise nicht im Rahmen dieser Frage liegt, dass die Abfrage auch Filter zum Ausfiltern von Dokumenten enthält. Dies geschieht, um die folgende Art der Abfrage:

&fq=(-document_id:4f845eb321c90b0aec5ee0eb)&fq=(-document_id:4f845cd421c90b0aec5ee041)&fq=(-document_id:4f845cea21c90b0aec5ee049)&fq=(-document_id:4f845cf821c90b0aec5ee04d)&fq=(-document_id:4f845d0e21c90b0aec5ee056)&fq=(-document_id:4f845d3521c90b0aec5ee064)&fq=(-document_id:4f845d3921c90b0aec5ee065)&fq=(-document_id:4f845d4921c90b0aec5ee06b)&fq=(-document_id:4f845d7521c90b0aec5ee07b)&fq=(-document_id:4f845d9021c90b0aec5ee084)&fq=(-document_id:4f845dac21c90b0aec5ee08e)&fq=(-document_id:4f845dbc21c90b0aec5ee093)

Diese können auch viele Zeichen für die Suchanfrage hinzufügen, und es wäre gut, wenn es auch ein besserer Weg, dies auch zu handhaben.

Jede Hilfe oder Beratung wird am meisten geschätzt. Vielen Dank.

Antwort

2

Ich würde vorschlagen, diese Standardparameter zu Ihrer Requesthandler-Konfiguration innerhalb solrconfig.xml hinzuzufügen. Sie sind immer gleich, oder?

<requestHandler name="standard" class="solr.SearchHandler" default="true"> 
    <lst name="defaults"> 
     <str name="defType">edismax</str> 
     <str name="qf">title^25 text_content^10 tags^50</str> 
    </lst> 
</requestHandler> 

Sie sollten in der Lage sein, Ihre statischen Filter hinzuzufügen und so weiter, so dass Sie diese Werte nicht angeben müssen, wenn Sie etwas anderes als der Standard tun wollen, mit Urls viel kürzer enden.

+0

Dachte darüber, obwohl die Boosts auch abhängig von den Suchbegriffen ändern, so dass ich nicht sicher bin, wie wertvoll ein Standard-Boost-Wert ist. Zum Beispiel kann title einen * basis * Boost von 25 haben, aber dann wird der Boost für jeden gesuchten Term hinzugefügt, um so etwas zu erstellen - title: foo^35 title: bar^40 title: foobar^30 . – Mun