Solr - synonimy zawierające wiele słów
Szybkie pytanie, nie wiem, jak radzić sobie z synonimami zawierającymi spację! Mam następującą konfigurację:
Plik konfiguracyjny SOLR
<fieldType ... >
<analyzer type="index">
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory"
catenateWords="1"
preserveOriginal="1"
splitOnCaseChange="1"
generateWordParts="1"
generateNumberParts="1"
catenateNumbers="1"
catenateAll="1"
/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="30" side="front"/>
</analyzer>
<analyzer type="query">
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.LengthFilterFactory" min="2" max="70" />
<filter class="solr.SynonymFilterFactory" synonyms="syn.txt" ignoreCase="true" expand="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
Mój plik: syn.txt
st., st => saint
istambul => istanbul
airport, apt => aéroport
NYC => New York
pt., pt => port
brussels => bruxelles
Wszystko działało dobrze, z wyjątkiem synonimu:
"NYC => New York"
Zrobiłem kilka badań i znalazłem następujące:
Pamiętaj, że chociaż SynonymFilter z przyjemnością będzie pracować z synonimami zawierającymi wiele słów (np. „Herbatnik morski, morski biscit, seabiscuit”)
Zalecanym podejściem do radzenia sobie z takimi synonimami jest rozszerzenie synonimu podczas indeksowania. Dzieje się tak, ponieważ istnieją dwa potencjalne problemy, które mogą pojawić się w czasie zapytania:
QueryParser Lucene tokenizuje na białym polu przed podaniem dowolnego tekstu do analizatora, więc jeśli ktoś szuka słów sea biscit, analizator otrzyma osobno słowa „morze” i „biscit” i nie będzie wiedział, że pasują do synonimu .
Wyszukiwanie fraz (tj. „Sea biscit”) spowoduje, że QueryParser przekaże cały ciąg do analizatora, ale jeśli SynonymFilter jest skonfigurowany do rozszerzenia synonimów, to kiedy QueryParser pobiera wynikową listę tokenów z Analyzera, to skonstruuje MultiPhraseQuery, która nie przyniesie pożądanego efektu.
Wynika to z ograniczonego mechanizmu dostępnego analizatorowi do wskazania, że dwa terminy zajmują tę samą pozycję: nie ma możliwości wskazania, że „fraza” zajmuje tę samą pozycję co termin.
W naszym przykładzie wynikowym MultiPhraseQuery byłoby „(sea | sea | seabiscuit) (biscuit | biscit)”, które nie pasowałoby do prostego przypadku „seabiscuit” występującego w dokumencie
Próbowałem więc zmienić mój plik konfiguracyjny i dodać filtry przy indeksowaniu, ale nie działa.
Czy coś ma jakieś pomysły?