2012-05-11 4 views
6

Я использую solr 3.6, и я хотел бы использовать сопоставления из Essester как решение для автозаполнения для многопользовательских поисков. К сожалению, Guidester возвращает только одну сортировку для многопользовательского поиска, даже если существует много предложений для каждого отдельного термина. В зависимости от моих тестовых запросов и базовых индексированных данных я уверен, что должно существовать большее количество сопоставлений.Solr возвращает только одну сортировку для Component Component

Что-то не так с моей конфигурацией Guidester?

<!--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> 

Пример ответа при д = би + бер:

<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

Ран в эту проблему самостоятельно, используя только основную Solr игрушка приложение (start.jar). Я пробовал каждую возможную комбинацию параметров проверки орфографии, в том числе spellcheck.maxCollations, но, похоже, не может получить больше одной сортировки. Любые идеи были бы оценены. – nlawson

ответ

14

У меня была та же проблема, как вы, и мне удалось решить. Оказывается, есть несколько вещей, которые вам нужно знать, чтобы заставить несколько сортировок работать правильно.

Во-первых, необходимо указать QueryComponent под components список из «предложить» requestHandler в вашем solrconfig.xml. В противном случае ваш requestHandler не знает, как запросить индекс, поэтому он не может понять, сколько запросов имеет каждый исправленный запрос, поэтому вы получите только один. Если вы добавили spellcheck.collateExtendedResults=true к вашему запросу, вы бы увидели, что hits были 0, что показывает, что Solr не потрудился проверить исправленный запрос по индексу.

Они намекают на это с несколько непрозрачных сообщением об ошибке:

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

Самый простой способ добавить это использовать по умолчанию QueryComponent, который называется «запрос». Таким образом, в XML вы публикуемую выше, вы бы изменить «компоненты» часть к:

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

Во-вторых, вам необходимо установить spellcheck.maxCollations более чем 1 (Дух), и менее интуитивно, что вам нужно установить spellcheck.maxCollationTries на некоторое количество (например, 1000). Если любой из них задан по умолчанию (оба значения 0), тогда Solr даст вам только одну сортировку. Кроме того, вам необходимо установить spellcheck.count быть больше 1.

В-третьих, вам нужно изменить запрос, чтобы включить поле, которое вы хотите найти против, и условия должны быть окружены кавычками для обеспечения надлежащего сопоставления. Таким образом, в случае запроса:

q=bio+ber

Это действительно должно быть:

q=text:"bio+ber"

Очевидно, что в вашем случае, «текст» это поле по умолчанию, так что вам не нужно Это. Но в моем случае я использовал поле не по умолчанию, поэтому я должен был указать его. В противном случае Solr будет считать хиты против поля «текст», и все результаты будут иметь 0 ударов, поэтому ранжирование будет бесполезным.

Так что в моем случае, запрос выглядел следующим образом:

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

И мой ответ выглядел следующим образом:

<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> 

успеха!

+0

+1 это дало мне кое-что попробовать. – Aaron

+0

'@ nlawson': Поможете ли вы решить эти ошибки: [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

Была такая же проблема.

Это ошибка Solr 3.6.1 (не уверен в предыдущих версиях). Пожалуйста, проверьте: https://issues.apache.org/jira/browse/SOLR-2853.

На самом деле этот комментарий ставит свет: https://issues.apache.org/jira/browse/SOLR-2853?focusedCommentId=13136014&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-13136014

Возможным решением является указание spellcheck.maxCollationTries быть равно числу сопоставлений, вам нужно, но это также заставит Solr проверить эти параметры сортировки против поискового индекса. Поэтому будьте осторожны, чтобы установить это свойство на большое количество. Подробнее об этом параметре: http://wiki.apache.org/solr/SpellCheckComponent#spellcheck.maxCollationTries.

Ошибка не закрыта, но уже имеются исправления.

Также я проверил код Solr 4.0.0-BETA - исправление уже существует.

Удачи Solrs!)