2012-02-15 27 views
12

Chúng tôi đang sử dụng Solr phiên bản 3.5 để tìm kiếm mặc dù Tweets, Tôi đang sử dụng WordDelimiterFactory với các thiết lập sau đây, để có thể tìm kiếm @username hoặc #hashtags:Solr tìm kiếm hashtag hoặc đề cập

<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="0" splitOnNumerics="0" preserveOriginal="1" handleAsChar="@#"/> 

tôi thấy như sau vá nhưng điều này dường như không hoạt động như tôi mong đợi, tôi có thiếu gì đó không?

https://issues.apache.org/jira/browse/SOLR-2059

Nhưng tìm kiếm @username cũng đang trở lại kết quả chỉ username hoặc #hashtag chỉ đang trở lại kết quả cho hastag. Làm thế nào tôi có thể đạt được điều này?

Toàn bộ Field Type:

<fieldType name="textnostem" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true"> 
    <analyzer type="index"> 
    <charFilter class="solr.HTMLStripCharFilterFactory"/> 
    <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="0" 
      splitOnNumerics="0" 
      preserveOriginal="1" 
      /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
    <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="0" 
      splitOnNumerics="0" 
      preserveOriginal="1"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 

<fieldType name="textnostem" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true"> 
    <analyzer type="index"> 
    <charFilter class="solr.HTMLStripCharFilterFactory"/> 
    <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="0" 
      splitOnNumerics="0" 
      preserveOriginal="1" 
      /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
    <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="0" 
      splitOnNumerics="0" 
      preserveOriginal="1"/>  
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

<fieldType name="textnostem" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true"> 
    <analyzer type="index"> 
    <charFilter class="solr.HTMLStripCharFilterFactory"/> 
    <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="0" 
      splitOnNumerics="0" 
      preserveOriginal="1" 
      handleAsChar="@#" 
      /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
    <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="0" 
      splitOnNumerics="0" 
      preserveOriginal="1" 
      handleAsChar="@#" 
      />  
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 
+0

Bạn có thể hiển thị toàn bộ định nghĩa fieldType mà bạn đang sử dụng, để chúng tôi có thể nếu các bộ lọc hoặc trình mã thông báo khác có thể ảnh hưởng đến kết quả của bạn? –

+1

Cá nhân, tôi chỉ cần thêm hai trường vào chỉ mục của bạn, một trường cho danh sách các đề cập, một cho các thẻ. Phân tích cú pháp các tweet này khi bạn thêm chúng vào chỉ mục. Bằng cách đó bạn không dựa vào chức năng mới. –

Trả lời

15

OK, vì vậy đọc qua các bản vá Solr-2059 mà bạn đề cập, có vẻ như họ đã thay thế handleAsChar thuộc tính trên WordDelimiterFactory với thuộc tính types. Dưới đây là các đặc điểm kỹ thuật cho thuộc tính đó từ phân tích, Tokenizers và Token Bộ lọc trang Solr Wiki:

loại = "wdfftypes.txt" phép tokenization tùy biến cho bộ lọc này. Tệp phải tồn tại trong thư mục solr/conf và các mục nhập có dạng (không có dấu ngoặc kép) "% => ALPHA" hoặc "\ u002C => DIGIT". Các loại cho phép là: LOWER, UPPER, ALPHA, DIGIT, ALPHANUM, SUBWORD_DELIM.

Vì vậy, sau đó nếu chúng ta lấy tài liệu này, cộng với ví dụ về các tập tin từ Solr-2059, tôi muốn giới thiệu như sau:

<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="0" splitOnNumerics="0" preserveOriginal="1" types="twittertypes.txt"/>

Sau đó xác định các tập tin twittertypes.txt như sau và đặt nó trong cùng thư mục với tệp schema.xml của bạn trong cá thể Solr của bạn (có thể là thư mục conf).

# A customized type mapping for WordDelimiterFilterFactory 
# the allowable types are: LOWER, UPPER, ALPHA, DIGIT, ALPHANUM, SUBWORD_DELIM 
#  
# the default for any character without a mapping is always computed from 
# Unicode character properties 

# Map the $, %, '.', and ',' characters to DIGIT 
# This might be useful for financial data. 
@ => ALPHA 
\u0023 => ALPHA 

Lưu ý rằng bạn cần sử dụng ký tự Unicode (UTF-8) cho biểu tượng băm vì nó được coi là nhận xét trong tệp văn bản.

Theo tất cả tài liệu, điều này sẽ khắc phục vấn đề của bạn và xử lý ký hiệu # và @ làm ký tự alpha, sẽ cung cấp hành vi bạn đang tìm kiếm.

+2

Cảm ơn Paige, đã tìm ra nó vào tối qua, làm việc như bạn đã đề cập. – sesmic

+0

Tôi đã làm tất cả các dịch vụ solr ở trên và khởi động lại, vẫn tìm kiếm #pizza và pizza mang lại kết quả tương tự, bất kỳ manh mối hoặc bước nào khác mà tôi nên theo dõi? – PepperoniPizza

+0

Bạn đã nhập lại tài liệu của mình sau khi thực hiện các thay đổi cấu hình chưa? Bất cứ khi nào bạn thực hiện các thay đổi trong tệp schema.xml tác động đến cách các tài liệu được lập chỉ mục, bạn phải gắn lại các tài liệu để các thay đổi được phản ánh trong các thuật ngữ được lập chỉ mục. –

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