2009-08-20 13 views
9

Mamy bazę danych filmów i seriali, a ponieważ dane pochodzą z wielu źródeł o różnej niezawodności, chcielibyśmy być w stanie wykonać rozmyte dopasowywanie ciągów na tytułach odcinków. Używamy Solr do wyszukiwania w naszej aplikacji, ale domyślne mechanizmy dopasowujące działają na poziomach słów, co nie jest wystarczające dla krótkich łańcuchów, takich jak tytuły:Jak używać przybliżonego dopasowania n-gramów z Solr?

Użyłem przybliżonego dopasowania n-gramów w przeszłości, a ja byłem bardzo się cieszę, gdy widzę, że Lucene (i Solr) wspierają to coś z pudełka. Niestety, nie udało mi się go poprawnie skonfigurować.

Przypuszczałem, że potrzebny jest specjalny typ pola dla tego, więc dodałem następujące pola typu do mojego schema.xml:

<fieldType 
    name="trigrams" 
    stored="true" 
    class="solr.StrField"> 
<analyzer type="index"> 
    <tokenizer 
     class="solr.analysis.NGramTokenizerFactory" 
     minGramSize="3" 
     maxGramSize="5" 
     /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
</analyzer> 
</fieldType> 

i zmieniła odpowiednie pole w schemacie do:

<field name="title" type="trigrams" 
    indexed="true" stored="true" multiValued="false" /> 

Jednak to nie działa tak jak się spodziewałem. Analiza zapytań wygląda poprawnie, ale nie dostaję żadnych wyników, co powoduje, że wierzę, że coś dzieje się w czasie indeksowania (tj. Tytuł jest indeksowany jak domyślne pole ciągu zamiast pola trygram).

Zapytanie próbuję coś jak

title:"guy walks into a psychiatrist office" 

(z typo lub dwa) i należy go dopasować "Guy Walks do psychiatry Office".

(nie jestem pewien, czy zapytanie jest poprawne.)

Ponadto chciałbym, aby móc zrobić coś więcej w rzeczywistości. Chciałbym obniżyć ciąg znaków, usunąć wszystkie znaki interpunkcyjne i spacje, usunąć angielskie stopwords, a następnie zmienić ciąg znaków na trygramy. Jednakże, filtry są stosowane tylko po tym, jak ciąg został zgeometryzowany ...

Z góry dziękuję za odpowiedzi.

+0

można pisać zapytanie używasz? – olle

+0

Edytowałem pytanie, aby dołączyć przykładowe zapytanie. –

Odpowiedz

3

Rozwiązanie okazało się bardzo proste: AND został ustawiony jako domyślny operator, a jeśli którykolwiek z ngrams nie pasował, całe zapytanie nie powiodło się. Tak więc wystarczyło dodać:

<solrQueryParser defaultOperator="OR" /> 

w mojej definicji schematu.

+5

Twoja odpowiedź sprawia, że ​​pytanie a posteriori nie ma nic wspólnego z ngramami. Czy mam rację? –

+2

@RyszardSzopa 'OR' jest zdecydowanie niezgodny z analizą n-gramową. 'OR' daje dużo wyników, ale generalnie całkiem kiepskie wyniki. –

9

Aby odpowiedzieć na ostatnią część pytania: solr ma również filtr ngram. Więc nie powinno się używać tokenizera Ngram (ale taki jak „WhitespaceTokenizer” na przykład), zastosowanie wszystkich filtrów wstępnego Ngram a następnie dodać ten jeden:

<filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="3" /> 
Powiązane problemy