2010-08-05 25 views
7

Điều tôi muốn làm là thực hiện truy vấn và nhận lại kết quả không phân biệt chữ hoa chữ thường và khớp với các từ một phần từ chỉ mục.Sử dụng nhiều mã thông báo trong Solr

Tôi có một lược đồ Solr được thiết lập tại thời điểm đã được sửa đổi để tôi có thể truy vấn và trả lại kết quả cho dù chúng là gì. Vì vậy, nếu tôi tìm kiếm iPOd, Iwill sẽ thấy iPod trở lại. Mã để làm điều này là:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
    </analyzer> 
... 
</fieldType> 

Tôi đã tìm thấy mã này sẽ cho phép chúng tôi thực hiện truy vấn đối sánh từ một phần, nhưng tôi không nghĩ mình có thể có hai mã thông báo trên một trường.

<fieldType name="text" class="solr.TextField" > 
    <analyzer type="index"> 
    <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="15" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
... 
</fieldType> 

Vì vậy, tôi có thể làm gì để thực hiện mã thông báo này trên trường?
Hoặc có cách nào hợp nhất chúng không?
Hoặc có cách nào khác để tôi có thể thực hiện tác vụ này không?

Trả lời

7

Khai báo một loại trường khác (ví dụ: tên khác) có bộ mã thông báo NGram, sau đó khai báo trường sử dụng trường kiểu với NGram và trường khác với trường "văn bản" tiêu chuẩn. Sử dụng copyField để sao chép một cái khác. Xem Indexing same data in multiple fields.

+1

Nhưng làm thế nào bây giờ truy vấn để kết quả sẽ xem xét dữ liệu được tokenized với cả hai tokenizers? Nói cách khác - làm thế nào để có được kết quả từ cả hai tokenizers cùng một lúc? –

7

Một giải pháp thay thế là áp dụng EdgeGramFilterFacgtory cho trường hiện tại và ở lại với trình mã thông báo hiện tại của bạn (WhitespaceTokenizerFactory), ví dụ:

<filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15" /> 

Điều này sẽ giữ cho giản đồ hiện tại của bạn không thay đổi, tức là bạn sẽ không cần một trường bổ sung trong đó có một tokenizer (NGramTokenizerFactory)

nhìn lĩnh vực của bạn sau đó một cái gì đó giống như dưới đây:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15" /> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
    </analyzer> 
... 
</fieldType> 
Các vấn đề liên quan