2015-09-03 18 views
12

Mam kolekcję Solr, która nie zwraca wyników dla kilku znaków spoza zestawu ASCII. Przykładem, którego używamy, jest ciąg znaków S11. • “≡ «Ñaïvétý» ‘¢¥£’ ¶!#%; szukanie całego ciągu nie zwraca żadnych wyników, mimo że mam obiekt z tym w indeksowanym polu. Jednakże wyszukiwanie podciągów tego łańcucha zwraca wyniki. Jedyne znaki, które powodują, że Solr nie zwraca żadnych dopasowań, to trzy w środku: • “≡. Pole zostało zindeksowane jako text_en, ale wypróbowałem też edge_ngram (mając nadzieję na odrobinę magii Cargo Cult, aby rozwiązać problem). Czy jest coś wyjątkowego w tych trzech postaciach, czy też muszę zmodyfikować sposób, w jaki Solr indeksuje pola?Wyszukiwanie Solr Uszkodzenie niektórych znaków

Szukamy poprzez django-haystack, ale problem pojawia się także w panelu administratora Solr.

Oto definicje typów dwa pola:

<fieldType name="edge_ngram" class="solr.TextField" positionIncrementGap="1"> 
    <analyzer type="index"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory" /> 
     <filter class="solr.LowerCaseFilterFactory" /> 
     <filter class="solr.WordDelimiterFilterFactory"   
      generateWordParts="1" generateNumberParts="1" catenateWords="0" 
      catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/> 
     <filter class="solr.EdgeNGramFilterFactory" 
      minGramSize="2" maxGramSize="50" side="front" /> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory" /> 
     <filter class="solr.LowerCaseFilterFactory" /> 
     <filter class="solr.WordDelimiterFilterFactory" 
      generateWordParts="1" generateNumberParts="1" catenateWords="0" 
      catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/> 
    </analyzer> 
</fieldType> 

<fieldType name="text_en" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" 
       ignoreCase="true" 
       words="lang/stopwords_en.txt" 
       enablePositionIncrements="true" 
       /> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.EnglishPossessiveFilterFactory"/> 
     <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
     <filter class="solr.PorterStemFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" 
      ignoreCase="true" expand="true"/> 
     <filter class="solr.StopFilterFactory" 
       ignoreCase="true" 
       words="lang/stopwords_en.txt" 
       enablePositionIncrements="true" 
       /> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.EnglishPossessiveFilterFactory"/> 
     <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
     <filter class="solr.PorterStemFilterFactory"/> 
    </analyzer> 
</fieldType> 
+0

Czy sprawdzić czy wykroje wykroje są naprawdę? Istnieje kilka znaków, które wyglądają jak spacje, ale nimi nie są. Jednym z przykładów jest "[Non-breaking space]" (https://en.wikipedia.org/wiki/Nonbreakbreak_space) ". Mogą one ulec zniekształceniu podczas kopiowania i wklejania. – cheffe

+0

Ostatnie pytanie :) w jaki sposób fieldTypes 'text_en' i' edge_ngram' są zdefiniowane w twoim schemacie? Czy podzieliłbyś się nimi? Następnie możemy spróbować odtworzyć problem. – cheffe

+0

@cheffe - dodano definicje pól. Zastanawiam się również nad białymi znakami, ale o ile wiem, są to zwykłe postacie kosmiczne. Solr nie ma problemu z dzieleniem zapytania na "słowa" na tych polach, podobnie jak inne przestrzenie, gdy patrzę na zapytanie w panelu administracyjnym. – Tom

Odpowiedz

1

można spróbować to ...

<fieldType name="text_reference" class="solr.TextField" sortMissingLast="true" omitNorms="true" positionIncrementGap="100"> 
     <analyzer type="index"> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
      <filter class="solr.LowerCaseFilterFactory"/> 
      <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="50" side="front"/> 
      <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="50" side="back"/> 
     </analyzer> 
     <analyzer type="query"> 
      <tokenizer class="solr.KeywordTokenizerFactory"/> 
      <filter class="solr.LowerCaseFilterFactory"/> 
     </analyzer> 
    </fieldType> 

enter image description here

+0

Nie wydaje się to mieć znaczenia. – Tom

+0

Proszę spojrzeć na stronę analizy ... czy tego oczekujesz? –

+0

Szczerze mówiąc, nie wiem wystarczająco dużo, aby wiedzieć, na co patrzę. Elementy 'EdgeNGraFilterFactory' wydają się prawidłowo dzielić i zapytanie nie wygląda na zmanipulowane. Widzisz mecz? Nie mogę powiedzieć z obrazu. – Tom

2

Czy próbowali za pomocą ASCIIFoldingFilterFactory

Konwertuje alfabet c, numeryczne i symboliczne znaki Unicode, które nie znajdują się w pierwszych 127 znakach ASCII (blok "Basic Latin" Unicode ) w ich odpowiednikach ASCII, jeśli taki istnieje.

<filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="false"/> 
+0

Nie ma szczęścia, dzięki. – Tom

1

Próbowałem zarówno fieldTypes Wysłany i sprawdził je na stronie analizy wynika, że ​​statki o stronie administratora Solr. Oba wydają się być w porządku - spójrz poniżej. Jasne odcienie szarości wskazują, że jest wytwarzany odpowiednik.

To mnie trochę zdziwi. Istnieje kilka powodów, a chociaż dlaczego nie dostać obrażeń:

  • zmieniłeś schema.xml bez odbudowy indeksu, to będzie działać, ale nie generują uderza
  • używasz dismax/edismax queryhandler z parametrem MM zdefiniowanym z niekorzystną wartością.
    • Można sprawdzić to w swoim solrconfig.xml
    • Jednak jest to tylko wartość domyślna, parametr może być zmieniany podczas wysyłania żądania ze swojego kodu.
  • masz ciekawe wartości w trzech plikach, które są zaangażowane podczas indeksowania, a mianowicie
    • lang/stopwords_en.txt
    • protwords.txt
    • synonimy.txt

wyników dla text_en enter image description here

Wyniki dla edge_ngram enter image description here

+0

Przebudowałem z każdą zmianą (przynajmniej mam taką nadzieję). Nie widzę "dismax" lub "edismax" w naszym pliku XML, ale jak mogę sprawdzić, czy to jest problem? Jeśli chodzi o koniec, nawet przyjmowanie synonimów i zatrzymywanie słów z definicji pola nie pomaga. – Tom

+0

Proszę sprawdzić '' masz w swoim pliku solrconfig.xml, które definiują który handler używasz. W najlepszym razie dodaj to do swojego pytania. Możesz sprawdzić [Solr Wiki] (https://wiki.apache.org/solr/SolrRequestHandler) lub [Solr Reference] (https://cwiki.apache.org/confluence/display/solr/RequestHandlers+and+ SearchComponents + in + SolrConfig), czego szukać. – cheffe

+0

Nie ma bloku requestHandler. – Tom

Powiązane problemy