Solr Fuzzy Szukaj podobnych słów

Próbuję zrobić rozmyte wyszukiwanie "jahngir" ~ 0.2, które nie zwraca żadnych wyników. Moje indeksy mają rekordy z danymi "JAHANGIR RAHMAN MD". Jeśli spróbuję wyszukać dokładnie słowo "jahangir" ~ 0.2, to działa. Czy ktoś może mi pomóc w tym, co robię źle? Spędziłem dużo czasu próbując dowiedzieć się, jak działa wyszukiwanie rozmyte Solr. Pomocne będą wszelkie linki wyjaśniające wyszukiwanie rozmyte Solr. Poniżej znajduje się pole tekstowe, którego używam do indeksowania. Dzięki w naprzód.

 <fieldType name="text" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">
  <analyzer type="index">
    <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.
      add enablePositionIncrements=true in both the index and query
      analyzers to leave a 'gap' for more accurate phrase queries.
    -->
    <filter class="solr.StopFilterFactory"
            ignoreCase="true"
            words="stopwords.txt"
            enablePositionIncrements="true"
            />
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
    <filter class="solr.PorterStemFilterFactory"/>
    <filter class="solr.CommonGramsFilterFactory" words="stopwords.txt" ignoreCase="true"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
    <filter class="solr.PhoneticFilterFactory" encoder="DoubleMetaphone" inject="false"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.StopFilterFactory"
            ignoreCase="true"
            words="stopwords.txt"
            enablePositionIncrements="true"
            />
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
    <filter class="solr.PorterStemFilterFactory"/>
    <filter class="solr.CommonGramsFilterFactory" words="stopwords.txt" ignoreCase="true"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
    <filter class="solr.PhoneticFilterFactory" encoder="DoubleMetaphone" inject="false"/>
  </analyzer>
</fieldType>

Oto konfiguracja, która zadziałała dla mnie po odpowiedzi. Dzięki!

<!-- Modified to fit fuzzy queries -->  
    <fieldType name="text_exact_fuzzy" class="solr.TextField" omitNorms="false">
      <analyzer type="index">
          <tokenizer class="solr.StandardTokenizerFactory"/>
          <filter class="solr.StandardFilterFactory"/>
          <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StandardFilterFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>
Author: Ravi, 2012-03-27

2 answers

Nie, nie musisz włączać stemmera, a użycie stemmera może powodować problem.

Masz zbyt wiele filtrów w polu tekstowym. Zamieniasz słowo na rdzeń Portera, który często nie jest prawdziwym słowem, a następnie bierzesz fonetyczny klucz tego słowa. Słowo powierzchniowe rzadko pasuje do klucza fonetycznego przechowywanego w indeksie. Klucz fonetyczny będzie bardzo różny od oryginalnego słowa.

Użyj strony analizatora w interfejsie administratora, aby zobaczyć, jak są terminy przetwarzane.

Zalecam podział rodzajów przybliżonych dopasowań na różne pola.

  • text_exact: małe litery, to wszystko
  • text_stem: małe litery i trzon
  • text_phonetic: małe i podwójne metafony, nie stem

Użyj dopasowania rozmytego z text_exact, ponieważ obsługuje błędy typowania. Nie używaj fuzzy w stosunku do innych pól.

Możesz ważyć te pola inaczej, dokładne dopasowanie jest dopasowaniem wyższej jakości niż odpoczywaj, więc może mieć większą wagę. Dopasowanie stemmed jest lepszym dopasowaniem niż fonetyczne, więc powinno mieć wagę mniejszą niż dokładne, ale większą niż fonetyczne.

 19
Author: Walter Underwood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-03 14:56:22

Aby wyszukiwanie rozmyte zadziałało, musisz włączyć poprawne Stemming i / lub fabrykę filtrów dla wybranego języka. Więcej szczegółów można znaleźć w temacie Analiza Langaugena Solr Wiki.

Edit: Zobacz Analizatory, Tokenizery i filtry tokenów , aby uzyskać więcej informacji na temat różnych sposobów indeksowania danych i tego, jak wpływa to na wyszukiwanie danych.

 0
Author: Paige Cook,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-27 18:20:02