2011-01-04 28 views
20

Tôi có một cấu trúc Solr khá đơn giản, đó là giữ ba lĩnh vực khác nhau:Làm thế nào để sử dụng Solr copyField chỉ

id, văn bản và các thẻ

trong schema.xml tôi đặt sau

<uniqueKey>id</uniqueKey> 
<defaultSearchField>text</defaultSearchField> 
<solrQueryParser defaultOperator="AND"/> 
<copyField source="tags" dest="text"/> 

Tuy nhiên, khi tôi tìm kiếm một từ chỉ xuất hiện dưới dạng thẻ, thì không tìm thấy tài liệu.

Câu hỏi của tôi ở đây là: copyField có xảy ra trước khi bất kỳ trình phân tích nào chạy (chỉ mục và truy vấn) như được mô tả here hoặc ngay trước bộ phân tích truy vấn?


EDIT

máy phân tích def:

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

và các định nghĩa lĩnh vực loại (họ có khá nhiều như configs mặc định):

<fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/> 
<fieldType name="int" class="solr.TrieIntField" precisionStep="0" omitNorms="true" positionIncrementGap="0"/> 

và định nghĩa trường cuối cùng:

<fields> 
    <field name="id" type="string" indexed="true" stored="true" required="true" /> 
    <field name="text" type="text" indexed="true" stored="false" multiValued="true" /> 
    <field name="tags" type="text" indexed="false" stored="false" /> 
</fields> 
<uniqueKey>id</uniqueKey> 
<defaultSearchField>text</defaultSearchField> 
<solrQueryParser defaultOperator="AND"/> 
<copyField source="tags" dest="text"/> 
+1

Hãy cẩn thận với defaultSearchField: "Tốt hơn là không sử dụng hoặc dựa vào cài đặt này, thay vào đó trình xử lý yêu cầu hoặc truy vấn LocalParams cho tìm kiếm phải chỉ định (các) trường mặc định để tìm kiếm. Cài đặt này ở đây có thể bị bỏ qua và nó đang được xem xét cho sự phản đối. " Từ tài liệu: https://wiki.apache.org/solr/SchemaXml#The_Default_Search_Field – Erowlin

Trả lời

26

CopyField được thực hiện khi tài liệu được lập chỉ mục, vì vậy nó nằm trước bộ phân tích chỉ mục. Nó thực sự giống như bạn đã đặt cùng một văn bản đầu vào trong hai lĩnh vực khác nhau. Nhưng sau đó, tất cả phụ thuộc vào các máy phân tích bạn đã xác định cho cả hai trường.

+0

cảm ơn câu trả lời của bạn. Tôi không xác định bất kỳ trình phân tích nào cho trường thẻ vì không cần phải ghi các thẻ khác với văn bản thông thường. Tôi chỉ cần sao chép nội dung của thẻ vào văn bản và để cho trình chỉ mục chạy trên trường đó -> Tôi làm điều gì sai vì nó không hoạt động – harpax

+1

Vui lòng đăng định nghĩa trường của bạn. –

+0

vui lòng xem chỉnh sửa ở trên. Cảm ơn rất nhiều lần nữa – harpax

3

Nếu bạn tìm kiếm q = thẻ: xyz thì xyz sẽ không được tìm thấy vì bạn đã gửi nó không được lập chỉ mục.

Nếu bạn thực hiện tìm kiếm mặc định, vâng, nó sẽ tìm kiếm các copyfield, tuy nhiên theo Solr wiki

Bất kỳ số tờ khai có thể được bao gồm trong schema của bạn, để hướng dẫn Solr mà bạn muốn nó lặp lại bất kỳ dữ liệu mà nó thấy trong "nguồn" lĩnh vực văn được thêm vào chỉ mục

Tôi nghĩ rằng việc không thêm 'thẻ' vào chỉ mục cũng sẽ làm cho bản sao của 'thẻ' không được lập chỉ mục.

+0

Cảm ơn câu trả lời của bạn. Tôi đã thay đổi điều đó thành '', nhưng kết quả không thay đổi – harpax

1

Tôi chưa thử sử dụng copyField để nối thêm văn bản bổ sung vào trường hiện có. Tôi cho rằng Solr có thể nối nó, hoặc thêm nó như là một giá trị thứ hai.

Nhưng đây là một vài ý tưởng để thử:

  1. Thử nghiệm với một tài liệu mà trường văn bản là trống, thậm chí không được nhắc đến như một trong cấu trúc. Có vẻ như nó tạo ra sự khác biệt khi các thẻ biến nó thành văn bản chính cho dù văn bản có bắt đầu như trống hoàn toàn hay không?

  2. Khai báo trường thứ hai, gọi trường đó là text2. Và sau đó CSONG sao chép các thẻ vào text2 thông qua một chỉ thị copyField thứ hai.Trường text2 này sẽ không có gì khác trong đó, có lẽ thậm chí không được đề cập trong các trường của bạn, vì vậy chắc chắn nó sẽ lấy nội dung.

Trong cả hai trường hợp, bạn sẽ kiểm tra kết quả bằng trình duyệt giản đồ, như trước đây. Tôi rất tò mò muốn biết bạn tìm ra cách nào!

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