2013-08-08 22 views
15

Tôi đã xem qua rất nhiều ví dụ và các câu hỏi khác ở đây và từ họ, tôi đã có cấu hình của tôi rất gần với những gì tôi cần nhưng tôi thiếu một chút cuối cùng mà tôi đang có một heck của một thời gian tập thể dục. Tôi đang tìm kiếm trên các giá trị như:Làm thế nào để có tự động hoàn thành Solr trên toàn bộ cụm từ khi truy vấn chứa nhiều cụm từ?

solar powered 
solar glass 
solar globe 
solar lights 
solar magic 
solid brass 
solid copper 

Những gì tôi muốn:

  1. Nếu tôi tìm kiếm sol kết quả nên bao gồm tất cả các giá trị. Những công việc này.
  2. Nếu tôi tìm kiếm solar Tôi sẽ chỉ nhận được năm người đầu tiên. Những công việc này.
  3. Nếu tôi tìm kiếm solar gl Tôi chỉ nhận được solar glasssolar globe. Điều này không hoạt động. Thay vào đó, tôi nhận được một bộ kết quả phù hợp cho solar và một bộ kết quả phù hợp thứ hai cho gl.

Tóm lại, tôi muốn xem xét chuỗi đầu vào nói chung, bất kể khoảng trắng nào. Tôi thu thập điều này được thực hiện bằng cách tạo một phân tích truy vấn riêng biệt (so với chỉ số), nhưng tôi đã không thể làm cho nó hoạt động được. Bất cứ ai có thể đề nghị một cấu hình mà sẽ cho tôi những gì tôi đang tìm kiếm?

tôi (không thành công) đã cố gắng:

  • Truy vấn với "solar gl"
  • Truy vấn với mm=100%
  • Xác định truy vấn và phân tích chỉ số riêng biệt cả hai sử dụng KeywordTokenizerFactory. (Dunno những gì tôi nghĩ rằng sẽ làm.)
  • Xác định một bộ phân tích chỉ mục nhưng không phải là một bộ phân tích truy vấn.
  • Xác định trình phân tích truy vấn không có trình thông báo.

Dưới đây là sơ đồ của tôi hiện tại:

<field name="suggest_phrase" type="suggest_phrase" 
    indexed="true" stored="false" multiValued="false" /> 

Và định nghĩa lĩnh vực:

<fieldType name="suggest_phrase" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer> 
     <tokenizer class="solr.KeywordTokenizerFactory" /> 
     <filter class="solr.LowerCaseFilterFactory" /> 
    </analyzer> 
</fieldType> 

Và cấu hình:

<searchComponent name="suggest_phrase" class="solr.SpellCheckComponent"> 
    <lst name="spellchecker"> 
     <str name="name">suggest_phrase</str> 
     <str name="classname">org.apache.solr.spelling.suggest.Suggester</str> 
     <str name="lookupImpl">org.apache.solr.spelling.suggest.fst.FSTLookup</str> 
     <str name="field">suggest_phrase</str> 
     <str name="buildOnCommit">true</str> 
    </lst> 
</searchComponent> 
<requestHandler class="org.apache.solr.handler.component.SearchHandler" name="/suggest_phrase"> 
    <lst name="defaults"> 
     <str name="spellcheck">true</str> 
     <str name="spellcheck.dictionary">suggest_phrase</str> 
     <str name="spellcheck.onlyMorePopular">true</str> 
     <str name="spellcheck.count">10</str> 
     <str name="spellcheck.collate">false</str> 
    </lst> 
    <arr name="components"> 
     <str>suggest_phrase</str> 
    </arr> 
</requestHandler> 
+0

Bạn đã thử giải pháp của tôi không? –

+0

Thêm bộ lọc 'shingle' vào loại trường của bạn [Shingles Filter fieldType] (http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.ShingleFilterFactory). – h4k1m

+0

@ h4kim Ok, chỉ cần thử điều này nhưng nó không cho tôi những gì tôi đang tìm kiếm. Nếu tôi truy vấn 'green coffee', tôi vẫn lấy lại hai bộ đối sánh, một cho từ' green' và một từ riêng biệt cho từ 'coffee'. Những gì tôi đang tìm kiếm là để có được một danh sách chỉ các tài liệu có chứa chuỗi chính xác 'green coffee' và không phải là' "green" OR "coffee" ' . –

Trả lời

15

Tìm thấy câu trả lời, cuối cùng! Tôi biết tôi đã thực sự gần gũi. Hóa ra cấu hình của tôi ở trên là chính xác và tôi chỉ cần thay đổi truy vấn của mình.

  1. Sử dụng KeywordTokenizerFactory để các chuỗi được lập chỉ mục nói chung.
  2. Sử dụng SpellCheckComponent cho trình xử lý yêu cầu.
  3. Mảnh tôi bị thiếu - không truy vấn với q=<string> nhưng với spellcheck.q=<string>.

Với dây nguồn đã nêu ở trên và một truy vấn của spellcheck.q=solar+gl này mang lại kết quả mong muốn:

solar glass 
solar globe 
+0

nếu bạn truy vấn 'spellcheck.q = glass' thì sao? –

+0

Tôi sẽ nhận được các chuỗi bắt đầu bằng thủy tinh: thủy tinh sạch hơn, chai thủy tinh, cửa sổ kính. –

+0

@AlexHowansky Bạn đang sử dụng phiên bản nào của Solr và bạn có nhớ gửi tệp schema.xml và solrconfig.xml không? Cảm ơn. – xelber

0

Tôi đã thử điều này nhiều lần và tôi đã đến conc lusion là không thể ra khỏi hộp. Tôi đã tìm thấy giải pháp thay thế cho điều đó:

Tôi đã lập chỉ mục dữ liệu thêm các ký tự đặc biệt giữa mỗi từ để chúng không được mã hóa. Ví dụ:

solarzzzzzzpowered 
solarzzzzzzglass 
solarzzzzzzglobe 

sau đó khi bạn soạn truy vấn của bạn, bạn chắc chắn rằng bạn thêm cùng một số lượng ký tự giữa hai từ bạn gõ, ví dụ solr gl trở thành solarzzzzzzgl.

Điều này sẽ đạt được hành vi mà bạn đang yêu cầu.

Một tùy chọn khác sẽ không sử dụng trường tự động và tạo trường tùy chỉnh cho chính bạn, nhưng sau đó bạn sẽ phải quản lý tìm kiếm theo ký tự đại diện và tất cả chỉ mục của chính mình và không quá thuận tiện về mặt thời gian và hiệu suất.

+0

Điều này được chứng minh và đưa vào sản xuất và nó hoạt động. :) –

+1

Hi Maurizio, ping bạn để bạn thấy câu trả lời của tôi ở trên - cuối cùng đã nhận nó để làm việc và nghĩ rằng bạn muốn được quan tâm đến kết quả. Chúc mừng. –

0

Bạn có thể sử dụng AnalyzingInfixLookupFactory hoặc FreeTextLookupFactory

  • AnalyzingInfixLookupFactory trả về toàn bộ nội dung của cánh đồng.
  • FreeTextLookupNhà máy trả về một số mã xác định.

Thông tin chi tiết và các thuật toán suggester khác, bạn sẽ tìm thấy ở đây: http://alexbenedetti.blogspot.de/2015/07/solr-you-complete-me.html

Solr Cấu hình

<lst name="suggester"> 
    <str name="name">AnalyzingInfixSuggester</str> 
    <str name="lookupImpl">AnalyzingInfixLookupFactory</str> 
    <str name="dictionaryImpl">DocumentDictionaryFactory</str> 
    <str name="field">title</str> 
    <str name="weightField">price</str> 
    <str name="suggestAnalyzerFieldType">text_en</str> 
</lst> 

<lst name="suggester"> 
    <str name="name">FreeTextSuggester</str> 
    <str name="lookupImpl">FreeTextLookupFactory</str> 
    <str name="dictionaryImpl">DocumentDictionaryFactory</str> 
    <str name="field">title</str> 
    <str name="ngrams">3</str> 
    <str name="separator"> </str> 
    <str name="suggestFreeTextAnalyzerFieldType">text_general</str> 
</lst> 
Các vấn đề liên quan