2011-09-21 9 views
6

Używam SOLR 3.2. Moja aplikacja wysyła zapytania do instancji SOLR dla typu pola tekstowego. W jaki sposób mogę sprawić, by SOLR zwracał wyniki, takie jak "książka", "półka z książkami", "bookasd" itd., Gdy użytkownik wydaje zapytanie typu "książka". Czy powinienem dołączać znaki "*" do ciągu zapytania ręcznie lub czy istnieje ustawienie w SOLR, aby domyślnie wykonywał prefiksy wyszukiwania w polu?Jak skonfigurować SOLR, aby użytkownicy mogli domyślnie wyszukiwać prefiksy?

To jest sekcja schema.xml dla typu pola tekstowego:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer type="index"> 
     <charFilter class="solr.HTMLStripCharFilterFactory"/> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" 
       ignoreCase="true" 
       words="stopwords.txt" 
       enablePositionIncrements="true" 
       /> 
     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="1" splitOnCaseChange="0"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
     </analyzer> 
     <analyzer type="query"> 
     <charFilter class="solr.HTMLStripCharFilterFactory"/> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenat0All="1" splitOnCaseChange="0"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
     </analyzer> 
    </fieldType> 
+0

Czy znalazłeś już odpowiedź? –

Odpowiedz

0

Będziesz albo trzeba zrobić obsługę po stronie klienta przez dodanie znaków wieloznacznych w końcu haseł.

Wpływ: -

  1. wieloznaczne zapytania mają wpływ na wydajność
  2. wieloznaczne zapytania nie są poddawane analizie. Tak więc analiza czasu zapytania nie zostanie zastosowana w przypadku wyszukiwanych haseł.

Inną opcją jest zaimplementowanie niestandardowego analizatora zapytań z potrzebną obsługą.

1

Miałem taki sam wymóg w odniesieniu do projektu. Musiałem wdrożyć sugestię. Co zrobiłem było zdefiniowanie tego zausznika FieldType

<fieldType class="solr.TextField" name="suggester"> 
    <analyzer type="index"> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 

     <filter class="solr.ShingleFilterFactory" minShingleSize="2" maxShingleSize="3" outputUnigrams="true" outputUnigramsIfNoShingles="false" /> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords_en.txt" enablePositionIncrements="true" /> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

użyłem ShingleFilterFactory bo potrzebne, aby dostać propozycję składającą się z jednej lub większej liczby słów.

Następnie użyłem zapytań facetingowych, aby uzyskać sugestie.

Facet.Limit = 10

Facet.Prefix = "książka"

Facet.Field = "zausznika" // to jest pole FieldType = "zausznika", w którym zapisał dane

Wiem, że używa wyników facet, ale może rozwiązuje problem.

Jeśli moja lub Jayendra Patil's answer nie daje Ci rozwiązanie można również przyjrzeć EdgeNGramFilterFactory

0

I Jestem pewien, że już to wymyśliłeś, ale odpowiedź brzmi:

Zajmowałem się tym, biorąc ostatni termin i umieszczając OR z ostatnim terminem plus symbol wieloznaczny, np. "moja ulubiona książka" staje się "moja + ulubiona + (książka LUB książka *)" i zwróci "moją ulubioną półkę". Prawdopodobnie i tak chcesz wykonać pewne przetwarzanie na wejściu (ucieczka itp.).

Jeśli szczególnie zależy Ci na wpisaniu tekstu w celu dopasowania do początku wyniku, to n-gramy na krawędzi są do zrobienia, ale czytając pytanie, nie wyglądało na to, że naprawdę o to prosiłeś.

Powiązane problemy