2015-04-30 29 views
6

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):

  1. q=DV\-5PBRP < - z tego zapytania mam 18 wyników, ale nie jedynym szukam (najprawdopodobniej jest to zrobić na domyślny df wyszukiwanie w polu nazwa produktu - dobrze)
  2. 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ć parametru q jak etapie 1.
  3. 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 witrynie qf musi obejmować więcej pól. Ponieważ musi szukać więcej pól (rzeczywiste qf = productname_search shortdesc_search fulldesc_search mfgpartno_search productname shortdesc fulldesc keywords), aby uzyskać bardziej dokładne wyszukiwanie I realizowany etap 4.
  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?

Odpowiedz

0

OK, myślę, że problem był nadmiernie przemyślany.

przypuszczałem (na podstawie mojego config), że liczba przykład część może być indeksowane tak:

DV-5PBRP -> {DV 5PBRP, DV5PBRP, DV-5PBRP} + NGrams 

ja też zakłada przeprowadzenie wyszukiwania „DV-5PBRP” (dosłowne kreska) będzie pasował tę trzecią opcję (używając zapytania podobnego do # 4 w moim pytaniu).

Wczoraj ponownie zostałem powiadomiony przez tego samego użytkownika o tym problemie i zacząłem myśleć, spróbujmy usunąć separator z wyszukiwania. Więc teraz poszukiwanie stało:

q=DV5PBRP&defType=edismax&qf=mfgpartno_search&q.op=AND 

mam wynik szukałem, co oznacza, że ​​mój solr config jest przynajmniej daje mi indeks jak opcją drugiego indeksu.

Teraz zacząłem przycinać znaki separatora od danych wprowadzanych przez użytkownika przed wysłaniem wyszukiwania do SOLR. To wydaje się działać pięknie!

1

Może możesz wypróbować Tokenizer z wyrażeniem regularnym i utworzyć odpowiednie wyrażenie regularne dla numerów artykułów. Lucene (z której Solr jest zbudowany) jest bardzo skoncentrowany na tokenizacji prozy.

Co chcesz tutaj, to prawdopodobnie podział na N-gram, a także 1-gram? I może kreski są zastąpione przestrzeni, coś

DV 5PBRP -> {DV 5PBRP DV, 5P, Br, PB, RP, D, V, 5, P, B, R}

Jak widać, indeks będzie dość duży dla bardzo małych pól. Upewnij się, że ranking wyników jest silnie ważony dla większych ngrams.

Myślę, że powinieneś usunąć listę słów zatrzymania dla pola numerów artykułów.

Rozmiar N-gram powinien prawdopodobnie zaczynać się od 1 lub 2.

Wystarczy upewnić się, że różne analizatory nie:

  • przełknąć odrobinę
  • usuwania pojedynczych lub kilku znaków (są to często w listach przystanek słowo)
  • usuwa numery
+0

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

+0

Oprócz NGrams w indeksie, chciałbym również zobaczyć: DV-5PBRP -> {DV 5PBRP, DV5PBRP, DV-5PBRP} – Chris

0

Jeśli używasz metody HTTP get, zakoduj ją i wyślij, używając:

URLEncoder.encode(searchWord,"UTF-8") 

Jest tak w przypadku java. Jeśli nie korzystasz z języka Java, wypróbuj odpowiedni kod kodowania. Pomoże nam to uniknąć "przestrzeni", "/" podobnych problemów.

+0

Używam PHP. Mam ciąg zapytania dla metody get zakodowanej przez http_build_query, aby obsłużyć poprawnie kodowanie, a następnie wyrażenie regularne zastępujące identyfikatory tablicy w łańcuchu "[]", ponieważ znalazłem SOLR, który ich nie lubi, ale obsługuje wiele warunki jako tablica. Naprawia również niektóre znaki, które nie powinny być zakodowane, ^() *: " – Chris

+0

Po użyciu wyrażenia regularnego, czy jesteś pewien, że jest on zakodowany i wysłany? – JESTIN6699

+0

absolutnie - a powyższe testy zostały wykonane przy użyciu stron administratora SOLR i Internetu z dostarczonego SOLR (ja oczywiście nie wymknąłem się z kreski w formie - jak by sobie z nią poradził). – Chris