2011-11-15 30 views
7

tôi sử dụng sau lọc trong schema.xml:Làm thế nào để tăng ngrams dài hơn trong solr?

<filter class="solr.EdgeNGramFilterFactory" minGramSize="4" maxGramSize="15" side="front"/> 

Làm thế nào tôi có thể nâng cao ngrams còn? Ví dụ: khi tôi tìm kiếm "bookpage", tài liệu chứa "bookpage" phải được xếp hạng cao hơn rất nhiều so với tài liệu chỉ có "sách".

Trả lời

5

Tôi không biết cách nào để tăng động dựa trên độ dài thời hạn (tức là, với toán tử Query Query). Tôi nghi ngờ không có một.

Điều đó nói rằng, tôi thường muốn ước tính logic mà bạn đang tìm kiếm: các cụm từ dài hạn xứng đáng có trọng số ngữ nghĩa cao hơn.

Phổ biến nhất, tôi sẽ lập chỉ mục giá trị văn bản thành hai trường khác nhau. Một là trường văn bản được xử lý tối thiểu không có ngram. Khác là tương tự, nhưng cũng được xử lý với ngrams.

Dưới đây là một số trích đoạn mẫu của lược đồ mà tôi đã sử dụng trong thời trang này. Đối với các tìm kiếm đối với lược đồ này, tôi sẽ tăng trường text nhiều hơn số text_ngram. Vì vậy, bất kỳ trận đấu nào với trường text sẽ ảnh hưởng rất lớn đến mức độ liên quan, trong khi các trận đấu với số text_ngram vẫn có thể nhận được kết quả có lẽ có liên quan.

<?xml version="1.0" encoding="UTF-8"?> 
<schema name="Sunspot Customized NZ" version="1.0"> 
    <types> 

    <!-- 
     A text type with minimal text processing, for the greatest semantic 
     value in a term match. Boost this field heavily. 
    --> 
    <fieldType name="text" class="solr.TextField" omitNorms="false"> 
     <analyzer> 
     <tokenizer class="solr.StandardTokenizerFactory" /> 
     <filter class="solr.StandardFilterFactory" /> 
     <filter class="solr.LowerCaseFilterFactory" /> 
     </analyzer> 
    </fieldType> 

    <!-- 
     Looser matches with NGram processing for substrings of terms and synonyms 
    --> 
    <fieldType name="text_ngram" class="solr.TextField" omitNorms="false"> 
     <analyzer> 
     <tokenizer class="solr.StandardTokenizerFactory" /> 
     <filter class="solr.StandardFilterFactory" /> 
     <filter class="solr.LowerCaseFilterFactory" /> 
     <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" /> 
     <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="6" side="front" /> 
     </analyzer> 
    </fieldType> 

    <!-- other stuff --> 

    </types> 
    <fields> 

    <!-- id, other scalar values --> 

    <!-- catch-all for the text and text_ngram types --> 
    <field name="text"  stored="false" type="text"  multiValued="true" indexed="true" /> 
    <field name="text_ngram" stored="false" type="text_ngram" multiValued="true" indexed="true" /> 

    <!-- various dynamicField definitions --> 

    <!-- sample dynamicField definitions for text and text_ngram --> 
    <dynamicField name="*_text" type="text" indexed="true" stored="false" multiValued="false" /> 
    <dynamicField name="*_text_ngram" type="text_ngram" indexed="true" stored="false" multiValued="false" /> 

    </fields> 

    <!-- copy text fields into my text and text_ngram catch-all fields --> 
    <copyField source="*_text" dest="text" /> 
    <copyField source="*_text" dest="text_ngram" /> 

</schema> 

Đây không phải chính xác những gì bạn đang tìm kiếm, nhưng bạn có thể sử dụng phương pháp tương tự.

Ví dụ: tạo một bộ sưu tập nhỏ các loại trường được xử lý NGram trung gian - giả sử, có chiều dài 1-3, 4-6, 7-9 - và cho chúng tăng lên tương ứng.

+0

wow, cảm ơn bạn rất nhiều vì cách tiếp cận này, không nghĩ đến việc lập chỉ mục nó nhiều lần :) Bạn đã nghĩ ra giải pháp này như thế nào? – ndee

+1

Tôi không thực sự nhớ lần đầu tiên tôi sử dụng kỹ thuật này - tôi cảm thấy như đó là một cách tiếp cận khá phổ biến trong Solr. Chỉ thị 'copyField' là một gợi ý khá mạnh cho hiệu ứng này. Tôi thường nghĩ về các từ phù hợp chính xác như có giá trị ngữ nghĩa mạnh nhất, nơi các từ đồng nghĩa, ngram, xuất phát vv là tất cả các cách tiếp cận khác nhau để "mở rộng" kết quả tìm kiếm trong trường hợp bỏ lỡ các cụm từ chính xác. –

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