2012-05-11 13 views
6

Używam Solr 3.6 i chciałbym użyć sortowania z sugestii jako rozwiązania autouzupełniania dla wyszukiwania w wielu terminach. Niestety, funkcja Suggester zwraca tylko jedną opcję sortowania dla wyszukiwania w wielu terminach, nawet jeśli istnieje wiele sugestii dla każdego pojedynczego terminu. W zależności od wyników wyszukiwania testowego i bazowych indeksowanych danych jestem pewien, że musi istnieć więcej sortowań.Solr zwraca tylko jedno sortowanie dla komponentu Suggester

Czy coś jest nie tak z moją konfiguracją Suggestera?

<!--configuration --> 
<searchComponent class="solr.SpellCheckComponent" name="suggest"> 
<lst name="spellchecker"> 
    <str name="name">suggest</str> 
    <str name="classname">org.apache.solr.spelling.suggest.Suggester</str> 
    <str name="lookupImpl">org.apache.solr.spelling.suggest.fst.WFSTLookupFactory</str> 
    <str name="field">text</str> <!-- the indexed field to derive suggestions from --> 
    <!--<float name="threshold">0.0005</float> disabled for test--> 
    <str name="buildOnCommit">true</str> 
</lst> 
</searchComponent> 

<requestHandler class="org.apache.solr.handler.component.SearchHandler" name="/suggest"> 
<lst name="defaults"> 
    <str name="spellcheck">true</str> 
    <str name="spellcheck.dictionary">suggest</str> 
    <str name="spellcheck.onlyMorePopular">true</str> 
    <str name="spellcheck.count">200</str> 
    <str name="spellcheck.collate">true</str> 
    <str name="spellcheck.maxCollations">10</str> 
</lst> 
<arr name="components"> 
    <str>suggest</str> 
</arr> 
</requestHandler> 

Przykładowa odpowiedź dla q = bio + ber:

<response> 
<lst name="responseHeader"> 
    <int name="status">0</int> 
    <int name="QTime">4</int> 
</lst> 
<lst name="spellcheck"> 
    <lst name="suggestions"> 
     <lst name="bio"> 
      <int name="numFound">27</int> 
      <int name="startOffset">0</int> 
      <int name="endOffset">3</int> 
      <arr name="suggestion"> 
       <str>bio</str> 
       <str>bio-estetica</str> 
       <str>bio-kosmetik</str> 
            ... 
      </arr> 
     </lst> 
     <lst name="ber"> 
      <int name="numFound">81</int> 
      <int name="startOffset">4</int> 
      <int name="endOffset">7</int> 
      <arr name="suggestion"> 
       <str>beratung</str> 
       <str>bern</str> 
       ... 
      </arr> 
     </lst> 
     <str name="collation">bio beratung</str> 
    </lst> 
</lst> 
</response> 
+0

Sam sobie poradziłem z tym problemem, korzystając z podstawowej aplikacji zabawkowej Solr (start.jar). Próbowałem każdej możliwej kombinacji parametrów sprawdzania pisowni, w tym spellcheck.maxCollations, ale nie można uzyskać więcej niż jednego sortowania. Wszelkie dociekania byłyby doceniane. – nlawson

Odpowiedz

14

miałem ten sam problem jak ty, i udało mi się go rozwiązać. Okazuje się, że jest kilka rzeczy, które musisz znać, aby poprawnie obsługiwać wiele sortowań.

Najpierw należy określić QueryComponent pod listą components z „sugerować” requestHandler w solrconfig.xml. W przeciwnym razie Twój requestHandler nie wie, jak wysłać zapytanie do indeksu, więc nie może dowiedzieć się, ile trafień ma każde poprawione zapytanie, więc dostaniesz tylko jeden. Jeśli dodałeś do zapytania zapytanie: spellcheck.collateExtendedResults=true, zobaczysz, że hits to 0, co pokazuje, że Solr nie zadał sobie trudu, aby sprawdzić poprawione zapytanie względem indeksu.

one wskazywać na to z nieco nieprzezroczysta komunikat o błędzie: „zapytanie”

INFO: Could not find an instance of QueryComponent. Disabling collation verification against the index.

Najprostszym sposobem dodania jest, aby użyć domyślnego QueryComponent, który jest nazywany Tak więc w XML ty zamieszczonych powyżej, można zmienić „składniki” część do:

<arr name="components"> 
    <str>suggest</str> 
    <str>query</str> 
</arr> 

drugie trzeba ustawić spellcheck.maxCollations być więcej niż 1 (duh) i mniej intuicyjne, trzeba ustawić spellcheck.maxCollationTries na dużą liczbę (np. 1000). Jeśli któryś z nich jest ustawiony na wartości domyślne (obie 0), Solr da ci tylko jedno uporządkowanie. Ponadto, trzeba ustawić spellcheck.count być większa niż 1.

trzecie, trzeba zmodyfikować kwerendę zawierać pole, które chcesz wyszukać przeciw, a warunki muszą być w cudzysłowie, aby zapewnić prawidłowe układanie. Tak więc w przypadku zapytanie:

q=bio+ber

To naprawdę powinno być:

q=text:"bio+ber"

Oczywiście w przypadku, „text” jest pole domyślnie, więc nie trzeba to. Ale w moim przypadku użyłem pola innego niż domyślne, więc musiałem to określić. W przeciwnym razie Solr zliczałby trafienia w polu "tekstowym", a wszystkie wyniki miałyby 0 trafień, więc ranking byłby bezużyteczny.

Więc w moim przypadku, zapytanie wyglądał następująco:

q=my_field:"brain+c" 
&spellcheck.count=5 
&spellcheck.maxCollations=10 
&spellcheck.maxCollationTries=1000 
&spellcheck.collateExtendedResults=true 

A moja reakcja wyglądała tak:

<response> 
    <lst name="responseHeader"> 
    <int name="status">0</int> 
    <int name="QTime">4</int> 
    </lst> 
    <lst name="spellcheck"> 
    <lst name="suggestions"> 
     <lst name="brain"> 
     <int name="numFound">1</int> 
     <int name="startOffset">15</int> 
     <int name="endOffset">20</int> 
     <arr name="suggestion"> 
      <str>brain</str> 
     </arr> 
     </lst> 
     <lst name="c"> 
     <int name="numFound">4</int> 
     <int name="startOffset">21</int> 
     <int name="endOffset">23</int> 
     <arr name="suggestion"> 
      <str>cancer</str> 
      <str>cambrian</str> 
      <str>contusion</str> 
      <str>cells</str> 
     </arr> 
     </lst> 
     <lst name="collation"> 
     <str name="collationQuery">my_field:"brain cancer"</str> 
     <int name="hits">2</int> 
     <lst name="misspellingsAndCorrections"> 
      <str name="brain">brain</str> 
      <str name="c">cancer</str> 
     </lst> 
     </lst> 
     <lst name="collation"> 
     <str name="collationQuery">my_field:"brain contusion"</str> 
     <int name="hits">1</int> 
     <lst name="misspellingsAndCorrections"> 
      <str name="brain">brain</str> 
      <str name="c">contusion</str> 
     </lst> 
     </lst> 
     <lst name="collation"> 
     <str name="collationQuery">my_field:"brain cells"</str> 
     <int name="hits">1</int> 
     <lst name="misspellingsAndCorrections"> 
      <str name="brain">brain</str> 
      <str name="c">cells</str> 
     </lst> 
     </lst> 
    </lst> 
    </lst> 
    <result name="response" numFound="0" start="0"/> 
</response> 

Sukces!

+0

+1 to dało mi kilka rzeczy do wypróbowania. – Aaron

+0

'@ nlawson': Czy pomożesz rozwiązać te błędy: [http://stackoverflow.com/questions/27502903/threshold-frequency-is-not-working-in-spell-check-in-solr] & [http : //stackoverflow.com/questions/27484326/getting-most-likely-documents-of-the-query-using-phonetic-filter-in-solr] – iNikkz

0

Miał ten sam problem.

To jest błąd Solr 3.6.1 (nie jestem pewien poprzednich wersji). Sprawdź: https://issues.apache.org/jira/browse/SOLR-2853.

Właściwie ten komentarz stawia światło: https://issues.apache.org/jira/browse/SOLR-2853?focusedCommentId=13136014&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-13136014

Możliwym rozwiązaniem jest określenie spellcheck.maxCollationTries być równa liczbie sortowania trzeba ale również wymusić Solr sprawdzić te sortowania przeciwko indeksu wyszukiwania. Dlatego należy ustawić tę właściwość na dużą liczbę. Więcej na ten temat tutaj: http://wiki.apache.org/solr/SpellCheckComponent#spellcheck.maxCollationTries.

Błąd nie jest zamknięty, ale są już przesłane poprawki.

Sprawdziłem również kod Solr 4.0.0-BETA - poprawka już istnieje.

Powodzenia Solrs!)

Powiązane problemy