2017-05-30 2 views
0

Ich habe seltsames Verhalten der partiellen Suche Solr. Ich benutze diese Filter:Solr partielle Suche, seltsames Verhalten

<filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="20" /> 

habe ich verschiedene Versionen: Solr 4 und Solr 5. Und ich habe weitere Resultate für das Matching: 1) Wort: Benachrichtigungen

Not - YES 
Noti - YES 
Notif - YES 
Notifi - NO 
Notific - YES 
Notifica - NO 
Notificat - NO 
Notificati - NO 
Notificatio - NO 
Notification - YES 
Notifications - YES 

2) Zwei Worte: A - Multiplikation und B - Multiplikation (mit Fehler)

Mul: A - YES, B - YES 
Mult: A - YES, B - YES 
Multi: A - YES, B - YES 
Multip: A - YES, B - YES 
Multipl: A - YES, B - YES 
Multipli: A - NO, B - YES 
Multiplic: A - YES, B - YES 
Multiplica: A - NO, B - YES 
Multiplicat: A - NO, B - YES 
Multiplicati: A - NO, B - YES 
Multiplicatin: A - NO, B - YES 
Multiplicatina: A - NO, B - NO 
Multiplicatinat: A - NO, B - NO 
Multiplicatinati: A - NO, B - NO 
Multiplicatinatio: A - NO, B - NO 
Multiplicatination: A - NO, B - YES 
Multiplicatio: A - NO, B - NO 
Multiplication: A - YES, B - YES (!!!) 

Warum funktioniert es so seltsam? Wie kann ich es reparieren?

Warum passt "Notific" zu "Notifications", aber "Notifi", "Notifica" und "Notificatio" nicht? Warum passt "Multiplika" zu "Multiplikation", aber nicht zu "Multiplikation"? Warum passt "Multiplikation" zu "Multiplikation"? Wie funktioniert es?

Ich betreibe nächste Abfrage (ich es von Debugger geholt):

/select?q="multiplic"&fq=(ss_search_api_datasource%3A"entity%3Anode"+ss_media_bundle%3A"document")&fq=(ss_search_api_datasource%3A"entity%3Amedia"+ss_node_bundle%3A"task"+ss_node_bundle%3A"supply"+ss_node_bundle%3A"store"+ss_node_bundle%3A"news"+ss_node_bundle%3A"faq")&fq=index_id%3A"search"&fq=hash%3A"8qk984"&rows=3&fl=ss_search_api_id%2Cscore&wt=json&indent=true&defType=edismax&qf=tm_attachment_file%5E1+ts_media_name%5E8+ts_media_file_name%5E2+ts_node_title%5E13+ts_node_body%5E3&stopwords=true&lowercaseOperators=true 

Gebrauchte Felddefinition von schema.xml für Solr 5:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <!-- in this example, we will only use synonyms at query time 
    <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/> 
    --> 
    <!-- Case insensitive stop word removal. --> 
    <filter class="solr.StopFilterFactory" 
      ignoreCase="true" 
      words="stopwords.txt" 
      /> 
    <filter class="solr.WordDelimiterFilterFactory" 
      protected="protwords.txt" 
      generateWordParts="1" 
      generateNumberParts="1" 
      catenateWords="1" 
      catenateNumbers="1" 
      catenateAll="0" 
      splitOnCaseChange="0" 
      preserveOriginal="1"/> 
    <filter class="solr.LengthFilterFactory" min="2" max="100" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="20" /> 
    </analyzer> 
    <analyzer type="query"> 
    <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
    <filter class="solr.StopFilterFactory" 
      ignoreCase="true" 
      words="stopwords.txt" 
      /> 
    <filter class="solr.WordDelimiterFilterFactory" 
      protected="protwords.txt" 
      generateWordParts="1" 
      generateNumberParts="1" 
      catenateWords="0" 
      catenateNumbers="0" 
      catenateAll="0" 
      splitOnCaseChange="0" 
      preserveOriginal="1"/> 
    <filter class="solr.LengthFilterFactory" min="2" max="100" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
    </analyzer> 
    <analyzer type="multiterm"> 
    <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
    <filter class="solr.StopFilterFactory" 
      ignoreCase="true" 
      words="stopwords.txt" 
      /> 
    <filter class="solr.WordDelimiterFilterFactory" 
      protected="protwords.txt" 
      generateWordParts="1" 
      generateNumberParts="1" 
      catenateWords="0" 
      catenateNumbers="0" 
      catenateAll="0" 
      splitOnCaseChange="1" 
      preserveOriginal="1"/> 
    <filter class="solr.LengthFilterFactory" min="2" max="100" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
    </analyzer> 
</fieldType> 
+0

Sie benötigen die vollständige Definition der Feldtypen und die Abfrage url – Persimmonium

+0

Persimmonium beteiligt zu zeigen, wie ich Definition importieren können, was Sie brauchen? Welche Abfrage sollte ich ausführen? –

+0

Fügen Sie die vollständige Definition der von Ihnen verwendeten Felder in schema.xml und die URL, die Sie veröffentlichen, ein, um dies zu testen. – Persimmonium

Antwort

1

Ich denke, die SnowballPorterFilterFactory das Problem zu schaffen. Können Sie dies überprüfen, indem Sie es aus dem Indexanalysator entfernen?

Sie können mehr Informationen über sie finden Here