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.
Nguồn
2011-11-15 19:39:33
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
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. –