2016-05-24 10 views
0

ich die folgende Typdefinition in Solr gemacht haben:Solr - KeywordTokenizerFactory - Exact Match für mehrere Wörter funktioniert nicht

<fieldType name="text_phrase" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    </analyzer>  
</fieldType> 

Es sollte Indexwerte wörtlich (kein tokenization).

Ich füge den Wert "Skinny Jeans" zu meinem Index hinzu.

Wenn ich die folgende Suchabfrage (url zum Lesen decodiert) laufen bekomme ich keine Ergebnisse:

http://myvm:8983/solr/mycore/select?q=*:*&fq=name:("skinny jeans")&wt=json&indent=true&debugQuery=true 

können Sie die URL sehen, ist für alles, was die Suche (*: *) mit einer Filterabfrage für der genaue Wert "Skinny Jeans".

ich dann den Wert „Jeans“ zu meinen Index hinzufügen und eine ähnliche Abfrage mit

&fq=name:("jeans") 

laufen Und ich das „Jeans“ Element finden tun.


So funktioniert es für ein einzelnes Wort, aber nicht für mehrere Wörter. Warum sollte das sein? Ich suche schließlich nach einem genauen Wert. Es lässt mich vermuten, dass die KeywordTokenizerFactory etwas Seltsames macht. Kann jemand bitte mitteilen, warum von einer solchen Grundkonfiguration keine Ergebnisse zurückgegeben werden?

Danke,

Antwort

1

Dies ist, weil Sie die KeywordTokenizerFactory für die Indizierung verwenden, die das Wort hält, wie es ist. Wendet keine Tokenisierung an oder erstellt keine Token. Aber während der Abfrage verwenden Sie WhitespaceTokenizerFactory, die Token für den Whitespace erstellt.

So KeywordTokenizerFactory wird ein Token wie "skinny jeans" als einzelnes Token im Index haben.

WhitespaceTokenizerFactory wird Token wie "skinny", "jeans" erstellen.

Sie können den Unterschied sehen, es wird nicht übereinstimmen. Sie suchen nach "skinny", "jeans" gegen "skinny jeans".

Sie müssen entweder den Index-Tokenizer oder den Abfrage-Tokenizer ändern.

Wenn Sie wollen, gehen Sie vor für die exakte Übereinstimmung dann sowohl für die KeywordTokenizerFactory halten, wie in tokenizer beim Indizieren und Abfragen wie unten dargestellt

<fieldType name="text_phrase" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> 
    </analyzer>  
</fieldType> 

Sie können die während Indizierung erstellt Token überprüfen und erstellt Token beim Abfragen Verwenden Sie das Solr-Analysetool.

+0

Ah ich denke ich verstehe, sagst du, dass obwohl ich in meiner Anfrage den Ausdruck "Skinny Jeans" doppelt zitierte, wird es nicht tatsächlich als Phrase abgefragt, sondern eher als einzelne Tokens? – mils

+0

Ja ... weil Tokes nicht auf diese Weise erstellt werden .... –

+0

Wenn ich eine WhitespaceTokenizerFactory und ShingleFilterFactory auf der Abfrageseite verwendet, könnte ich ähnliche Ergebnisse bekommen wie ich danach suche? – mils