2012-04-05 30 views
18

Tôi có một truy vấn đại diện trông giống như sau:Solr truy vấn đại diện với khoảng trắng

q=location:los a* 

Tôi muốn nó để phù hợp với "los angeles" và "los Altos". Truy vấn như:

q=los* 

Chỉ hoạt động tốt, nhưng ngay sau khi tôi thêm khoảng trắng, tôi không nhận được kết quả. Làm cách nào tôi có thể sử dụng khoảng trắng trong các truy vấn ký tự đại diện của mình?

+0

Có thể điều này là không thể, truy vấn cụm từ tiền tố không được phép: [link] (http://lucene.apache.org/core /old_versioned_docs/versions/3_4_0/queryparsersyntax.html#Wildcard%20ASearches) – tbaz

Trả lời

0

Nếu không thấy cấu hình của bạn, tôi sẽ nói sử dụng KeywordTokenizerFactory vì bạn có thể đã mã hóa trên khoảng trắng ngay bây giờ.

+0

Cảm ơn, tôi đang sử dụng DefaultAnaylzer để lập chỉ mục và văn bản thuật ngữ của tôi là "los angeles" (không có mã thông báo) trong chỉ mục. – tbaz

0

Truy vấn (giả sử bạn có tokenizer khoảng trắng): q = vị trí: los một * có nghĩa là bạn tìm kiếm tài liệu với từ "los" và từ đó bắt đầu với "a"

Solr (càng nhiều mà tôi biết) không thể xác định nếu một từ (hoặc cụm từ) xuất hiện trước một từ khác.

1

Tôi có thể đề nghị các plugin Solr truy vấn tiền tố nếu bạn chỉ sử dụng nó cho các kí hiệu khi hậu tố như chúng tôi đã http://lucene.apache.org/solr/4_0_0/solr-core/org/apache/solr/search/PrefixQParserPlugin.html

sử dụng ví dụ

http://localhost:8983/solr/collection/select?q={!prefix%20f=name}Bob%20Smi 

sẽ phù hợp với "Bob Smith" hoặc "Bob Smit "nhưng không chuyển đổi thành séc (" Bob "HOẶC" Smi * ") như sẽ xảy ra nếu bạn sử dụng giải pháp đầu tiên mà bạn có thể cân nhắc dọc theo các dòng q=name:Bob%20Smi*

Hy vọng đây là một số trợ giúp cho bạn hoặc người khác tìm kiếm như imple giải pháp vì tôi đã đập đầu của tôi chống lại một bức tường trong nhiều giờ trước khi tôi tìm thấy điều này!

29

Gần đây tôi đã tự mình gặp vấn đề này và dường như tất cả những gì bạn cần làm là thoát khỏi không gian trong truy vấn của bạn. truy vấn ban đầu của bạn sẽ được giải thích bởi Solr là một cái gì đó như thế này:

location:los id:a* 

(giả sử "id" là lĩnh vực tìm kiếm mặc định của bạn)

Tuy nhiên, nếu bạn đã viết câu hỏi của bạn như sau:

location:los\ a* 

Sau đó, nó sẽ kết thúc đang được phân tích như sau:

location:los a* 

Và trên nên mang lại kết quả mà bạn mong muốn (giả sử dữ liệu của bạn được lập chỉ mục đúng).

Mẹo: Tìm hiểu tất cả điều này thật đơn giản. Chỉ cần thêm &debugQuery=on vào cuối url bạn sử dụng khi gửi truy vấn để xem cách phân tích cú pháp đó bằng Solr.

+1

Tôi đã xác nhận điều này hoạt động với một trường chuỗi (nhưng không phải là văn bản, xem http://stackoverflow.com/questions/2630879/solr-exact-word-search để biết thêm thông tin). Tôi muốn tìm thấy điều này sớm hơn ... cũng, debugQuery = trên xứng đáng một upvote ngày của riêng mình - rất hữu ích! – BLogan

0

Tôi nghĩ rằng bạn nên sử dụng cấu hình như thế này

<fieldType name="text" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory" /> 
     <filter class="solr.PatternReplaceFilterFactory" pattern="(\s+)" replacement="" replace="all" /> 
    </analyzer> 
    </fieldType> 

và bạn phải xử lý nhập từ khóa của bạn cho tìm kiếm như loại bỏ khoảng trắng

0

Đối với tôi làm việc

<fieldtype name="text_like" class="solr.TextField"> 
    <analyzer type="index"> 
     <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="1000"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.LowerCaseTokenizerFactory"/> 
    </analyzer> 
</fieldtype> 

và truy vấn field:*some\ phrase* (trong java chữ một cần phải thoát khỏi \ as \\).

0

Tôi đã gặp vấn đề tương tự trong dự án của mình. Khi tôi đã tìm kiếm một từ cùng với khoảng trống, tôi đã không nhận được kết quả. Vì vậy, tôi đã thay thế khoảng trắng bằng dấu gạch nối "-" trong khi lập chỉ mục và truy vấn. Dưới đây là tệp lược tả schema.xml mà tôi đã sử dụng để làm như vậy:

<fieldType name="text_ci" class="solr.TextField" positionIncrementGap="100"> 
<analyzer type="index"> 
<tokenizer class="solr.NGramTokenizerFactory" minGramSize="2" maxGramSize="250"/> 
<filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.TrimFilterFactory" /> 
    <filter class="solr.PatternReplaceFilterFactory" 
      pattern="([/\s+])" replacement="-" replace="all" 
    /> 
</analyzer> 
<analyzer type="query"> 
<tokenizer class="solr.EdgeNGramTokenizerFactory" minGramSize="2" maxGramSize="250"/> 
<filter class="solr.LowerCaseFilterFactory"/> 
<filter class="solr.TrimFilterFactory" /> 
    <filter class="solr.PatternReplaceFilterFactory" 
      pattern="([/\s+])" replacement="-" replace="all" 
    /> 
</analyzer> 
</fieldType> 
Các vấn đề liên quan