Mam pewne problemy z budową zapytania Solr lub sposobem konfiguracji schematu, aby wyszukiwanie w naszym sklepie internetowym działało lepiej.Solr search dash pod numerem katalogowym
Pierwsza część konfiguracji (Solr 4.2.1)
<field name="mfgpartno" type="text_en_splitting_tight" indexed="true" stored="true" />
<field name="mfgpartno_sort" type="string" indexed="true" stored="false" />
<field name="mfgpartno_search" type="sku_partial" indexed="true" stored="true" />
<copyField source="mfgpartno" dest="mfgpartno_sort" />
<copyField source="mfgpartno" dest="mfgpartno_search" />
<fieldType name="sku_partial" class="solr.TextField" omitTermFreqAndPositions="true">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" preserveOriginal="1" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="1" splitOnCaseChange="1"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.TrimFilterFactory" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="false"/>
<filter class="solr.NGramFilterFactory" minGramSize="4" maxGramSize="100" side="front" />
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.TrimFilterFactory" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="false"/>
</analyzer>
</fieldType>
Pozwól podzielenie go na etapy (jestem tylko zamiar iść na tyle, aby odtworzyć problem - początkowe stadia nie używasz edismax , że to, co wybraliśmy do korzystania z naszej strony internetowej):
q=DV\-5PBRP
< - z tego zapytania mam 18 wyników, ale nie jedynym szukam (najprawdopodobniej jest to zrobić na domyślnydf
wyszukiwanie w polu nazwa produktu - dobrze)q=mfgpartno_search:DV\-5PBRP
< - to daje mi 1 wynik szukam, ale ze względu na budynku zapytań muszę zrobić na stronie internetowej, że lepiej, jeśli mogę użyć parametruq
jak etapie 1.q=DV\-5PBRP&defType=edismax&qf=mfgpartno_search
< - to również daje mi 1 wynik, którego szukam, ale znowu ze względu na wyszukiwanie w witrynieqf
musi obejmować więcej pól. Ponieważ musi szukać więcej pól (rzeczywisteqf
=productname_search shortdesc_search fulldesc_search mfgpartno_search productname shortdesc fulldesc keywords
), aby uzyskać bardziej dokładne wyszukiwanie I realizowany etap 4.q=DV\-5PBRP&defType=edismax&qf=mfgpartno_search&q.op=AND
< - z tego testu otrzymuję 0 wyniki - choć to działa świetnie na większości wyszukiwań na naszej stronie.
Mój duży problem z wyszukiwaniem to znaki specjalne, takie jak kreska, która czasami musi być literalna, a czasami działają jako separatory, jak w nazwach produktów lub opisach. Czasami ludzie mogą nawet wyszukiwać lub zastępować myślnik spacją po wyszukiwaniu numerów części i nadal powinny pokazywać odpowiednie dane.
Trochę utknąłem na temat tego, jak uruchomić funkcję wyszukiwania znaków specjalnych, szczególnie w odniesieniu do pola mfgpartno_search. Jak mogę skonfigurować schemat lub zapytanie (lub oba), aby to działało?
Jeśli spojrzysz na moją konfigurację, o ile widzę, indeksator robi wszystko, co powiedziałeś. WordDelimiterFilterFactory ma preserveOriginal, tak aby nie połknąć kreski, StopFilterFactory używa tylko domyślnego pliku stopwords.txt, a NGramFilterFactory ma minGramSize równy 4. Mniej niż ten ma tendencję do posiadania znacznie większych indeksów i więcej fałszywych trafień. – Chris
Oprócz NGrams w indeksie, chciałbym również zobaczyć: DV-5PBRP -> {DV 5PBRP, DV5PBRP, DV-5PBRP} – Chris