2012-05-11 15 views
6

Tôi sử dụng solr 3.6 và tôi muốn sử dụng collations từ suggester làm giải pháp tự động hoàn chỉnh cho tìm kiếm nhiều cụm từ. Thật không may, Gợi ý chỉ trả về một đối chiếu cho tìm kiếm nhiều cụm từ, ngay cả khi có nhiều đề xuất cho mỗi cụm từ tồn tại. Tùy thuộc vào các tìm kiếm thử nghiệm của tôi và dữ liệu được lập chỉ mục cơ bản, tôi chắc chắn rằng nhiều collations hơn phải tồn tại.Solr chỉ trả về một đối chiếu cho Thành phần đề xuất

Có vấn đề gì với cấu hình Đề xuất của tôi?

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

Ví dụ phản ứng cho q = sinh học + 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

Tự mình gặp phải vấn đề này, chỉ cần sử dụng ứng dụng đồ chơi Solr cơ bản (start.jar). Tôi đã thử mọi kết hợp có thể hiểu được của các thông số kiểm tra chính tả, bao gồm cả spellcheck.maxCollations, nhưng dường như không thể có nhiều hơn một đối chiếu. Mọi thông tin chi tiết sẽ được đánh giá cao. – nlawson

Trả lời

14

Tôi đã gặp vấn đề tương tự như bạn, và tôi quản lý để giải quyết nó. Nó chỉ ra có một số điều bạn cần biết để có được nhiều collations để hoạt động đúng.

Thứ nhất, bạn phải chỉ định một QueryComponent dưới components danh sách các "đề nghị" requestHandler trong solrconfig.xml của bạn. Nếu không, requestHandler của bạn không biết cách truy vấn chỉ mục, do đó, nó không thể tìm ra số lần truy cập mà mỗi truy vấn đã sửa có, do đó bạn sẽ chỉ nhận được một. Nếu bạn đã thêm spellcheck.collateExtendedResults=true vào truy vấn của mình, bạn sẽ thấy rằng hits là 0, cho thấy Solr không bận tâm kiểm tra truy vấn đã sửa đối với chỉ mục.

Họ gợi ý điều này với một thông báo lỗi hơi đục: "query"

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

Cách dễ nhất để thêm nó là sử dụng mặc định QueryComponent, được gọi là Vì vậy, trong XML bạn được đăng trên, bạn muốn thay đổi "bộ phận" một phần để:

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

Thứ hai, bạn cần phải thiết lập spellcheck.maxCollations được hơn 1 (duh), và ít bằng trực giác, bạn cần để đặt spellcheck.maxCollationTries thành một số lớn (ví dụ: 1000). Nếu một trong hai giá trị này được đặt ở giá trị mặc định (cả 0), thì Solr sẽ chỉ cung cấp cho bạn một đối chiếu. Ngoài ra, bạn cần đặt số spellcheck.count lớn hơn 1.

Thứ ba, bạn cần phải sửa đổi truy vấn để bao gồm trường bạn muốn tìm kiếm và cụm từ phải được bao quanh bởi dấu ngoặc kép để đảm bảo đối chiếu hợp lý. Vì vậy, trong trường hợp của truy vấn của bạn:

q=bio+ber

này thực sự cần là:

q=text:"bio+ber"

Rõ ràng trong trường hợp của bạn, "văn bản" là lĩnh vực mặc định, do đó bạn không cần nó. Nhưng trong trường hợp của tôi, tôi đã sử dụng một trường không mặc định, vì vậy tôi phải xác định nó. Nếu không, Solr sẽ đếm số lần truy cập dựa vào trường "văn bản" và tất cả kết quả sẽ có 0 lần truy cập, do đó xếp hạng sẽ vô ích.

Vì vậy, trong trường hợp của tôi, truy vấn trông như thế này:

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

Và phản ứng của tôi trông như thế này:

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

thành công!

+0

+1 điều này đã cho tôi một số điều cần thử. – Aaron

+0

'@ nlawson': Bạn sẽ giúp giải quyết các lỗi này: [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

Có cùng sự cố.

Đây là lỗi của Solr 3.6.1 (không chắc chắn về các phiên bản trước đó). Vui lòng kiểm tra: https://issues.apache.org/jira/browse/SOLR-2853.

Thực ra nhận xét này đặt ánh sáng: https://issues.apache.org/jira/browse/SOLR-2853?focusedCommentId=13136014&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-13136014

Một cách giải quyết có thể là để xác định spellcheck.maxCollationTries là bằng với số collations bạn cần nhưng điều đó cũng sẽ buộc Solr để kiểm tra những collations chống chỉ mục tìm kiếm. Vì vậy, hãy cẩn thận để đặt thuộc tính này thành một số lớn. Thông tin thêm về thông số này tại đây: http://wiki.apache.org/solr/SpellCheckComponent#spellcheck.maxCollationTries.

Lỗi chưa được đóng nhưng có các bản vá đã được gửi.

Ngoài ra tôi đã kiểm tra mã của Solr 4.0.0-BETA - sửa lỗi đã có.

Chúc may mắn!)

Các vấn đề liên quan