2017-07-07 2 views
0

Wie führe ich eine einfache Abfrage auf ein Textfeld mit einer OR-Bedingung? So etwas wie name:ABC OR name:XYZ so würde die resultierende Menge nur die Dokumente enthalten, wo Name ist genau "XYZ" oder "ABC" Dugs Tonnen von Handbüchern, kann dies nicht herausfinden. Ich benutze Solr 5.5.0Solr OR Abfrage auf ein Textfeld

aktualisieren: Upgrade auf Solr 6.6.0, kann es immer noch nicht herausgefunden. Im Folgenden Abbildungen sind mein Problem zu demonstrieren:

  1. Dies funktioniert:

works

  1. Dies funktioniert auch:

works too

  1. Dies funktioniert immer noch:

still works

  1. Aber das nicht! Oh mein Gott warum!?

does not work omg why

+0

OMG es ist auch so in SolrJ (scala)! 'solrQuery.setQuery (s" "" sku: ($ {skus.mkString ("")}) "") '- funktioniert nicht ' solrQuery. setQuery (s "" "*: * UND sku: ($ {skus.mkString (" ")})" "") - arbeiten s! Lucene, warum machst du das ?! – Vasily802

Antwort

0

Eine verrückte Abhilfe, die ich gerade habe kommen mit:.

enter image description here

+0

Weniger verrückte Abfrage, die funktioniert: '+ sku: (13576609 13576610)' – Vasily802

1

Es gibt viele Möglichkeiten oder Abfrage auszuführen. Nachfolgend habe ich einige von ihnen aufgelistet. Sie können eines davon auswählen.

[Einfache Abfrage]

q=name:(XYZ OR ABC) 

[Lucene Query-Parser]

q={!lucene q.op=OR df=name v="XYZ ABC"} 
1

Ihre Syntax ist richtig, aber was Sie für die Frage ist nicht, welche Textfelder aus zum. Ein Textfeld wird in Token aufgeteilt (in mehrere Token aufgeteilt) und jedes Token wird selbst durchsucht. Wenn der eingegebene Text "ABC DEF GHI" ist, wird er in drei separate Token aufgeteilt, nämlich "ABC", "DEF" und "GHI". Wenn Sie also Feld: ABC suchen, fragen Sie wirklich nach einem Dokument, das irgendwo den Token "ABC" hat.

Da Sie eine genaue Spiel ausführen möchten, wollen Sie gegen ein Feld abzufragen, die als string Feld definiert ist, da dies den Wert halten wird wörtlich (einschließlich Gehäuse, so wird der passende Fall empfindlich sein). Sie können Solr anweisen, den gleichen Inhalt in mehrere Felder zu indizieren, indem Sie eine copyFile-Anweisung hinzufügen, um den für Feld foo übermittelten Inhalt zu übernehmen und in Feld bar zu kopieren, damit Sie bei Bedarf eine genaue Übereinstimmung und eine allgemeinere Übereinstimmung erzielen können Suche wenn nötig.

Wenn Sie exakte Suchvorgänge ohne Groß- und Kleinschreibung durchführen müssen, können Sie einen KeywordTokenizer verwenden. Der KeywordTokenizer tut nichts und behält die gesamte Zeichenfolge als einzelnes Token bei, bevor Sie der Analysekette Filter hinzufügen können. Indem Sie einen Kleinbuchstabenfilter hinzufügen, geben Sie Solr an, die Zeichenkette ebenfalls in Kleinbuchstaben zu schreiben, bevor Sie sie speichern (oder danach suchen).

Sie können die Seite "Analyse" auf der Solr-Administratorseite verwenden, um zu testen, wie der Inhalt für Ihr Feld in jedem Schritt verarbeitet wird.

Nach dieser Abfrage als string_field:ABC OR string_field:XYZ sollte das tun, was Sie wollen (oder string_field:(ABC OR XYZ) oder ein paar andere Möglichkeiten, um das gleiche auszudrücken