2009-10-21 38 views
6

Làm cách nào để đảm bảo rằng lucene mang lại cho tôi kết quả tìm kiếm có liên quan khi chuỗi nhập của tôi chứa các cụm từ như C++? Lucene dường như bỏ qua các ký tự ++.Xử lý + làm ký tự đặc biệt trong tìm kiếm Lucene

Chi tiết mã: Khi tôi thực hiện dòng này, tôi nhận được truy vấn tìm kiếm trống.

queryField = multiFieldQueryParser.Parse(inpKeywords); 

keywordsQuery.Add(queryField, BooleanClause.Occur.SHOULD); 

Và đây là phân tích tùy chỉnh của tôi:

public class CustomAnalyzer : Analyzer 
    { 
     private static readonly WhitespaceAnalyzer whitespaceAnalyzer = new WhitespaceAnalyzer(); 
    public override TokenStream TokenStream(String fieldName, System.IO.TextReader reader) 
     { 
      TokenStream result = whitespaceAnalyzer.TokenStream(fieldName, reader); 
      result = new StandardTokenizer(reader); 
      result = new LowerCaseFilter(result); 
      result = new StopFilter(result, stop_words); 
      return result; 
     } 
} 

Và tôi đang thực hiện truy vấn tìm kiếm theo cách này:

indexSearcher.Search(searchQuery, collector); 

tôi đã làm thử queryField = multiFieldQueryParser.Parse (QueryParser.Escape (inpKeywords)) ;, nhưng nó vẫn không hoạt động. Đây là truy vấn được thực thi và trả về 0 lần truy cập. "+ (())"

Cảm ơn.

Trả lời

3

Từ, + là một nhân vật đặc biệt, nó cần phải được thoát. Danh sách tất cả các ký tự cần phải được thoát là here (Xem phần dưới cùng của trang.)

Bạn cũng cần phải cẩn thận về trình phân tích bạn sử dụng trong khi lập chỉ mục. Ví dụ: StandardAnalyzer sẽ bỏ qua +. Bạn có thể cần phải sử dụng một cái gì đó như WhiteSpaceAnalyzer trong khi lập chỉ mục và tìm kiếm, mà sẽ bảo vệ các ký tự đặc biệt trong tokenstream. Hãy nhớ rằng bạn cần sử dụng cùng một bộ phân tích trong khi lập chỉ mục và tìm kiếm.

+0

đang sử dụng WhiteSpaceAnalyzer chỉ ... nhưng vẫn + ký tự được bỏ qua –

0

Hãy thử UTF-8 mã hóa truy vấn tìm kiếm của bạn.

Bạn có thể bật này như mô tả trong this article

+0

liên kết không hoạt động .... – Nirmal

1

Ngoài việc chọn máy phân tích phù hợp, bạn có thể sử dụng QueryParser.Escape(string s) để đảm bảo tất cả các ký tự đặc biệt được thoát đúng cách.

Vì đây là chức năng tĩnh tĩnh, bạn có thể sử dụng nó, ngay cả khi bạn đang sử dụng MultiFieldQueryParser.

Ví dụ, bạn có thể thử một cái gì đó như thế này:

queryField = multiFieldQueryParser.Parse(QueryParser.Escape(inpKeywords)); 
+0

nhờ cho ur answer.Please tham khảo cho câu hỏi được cập nhật của tôi. –

+0

Cảm ơn một lần nữa vì câu trả lời Jesse.I đã thử queryField = multiFieldQueryParser.Parse (QueryParser.Escape (inpKeywords)) ;, nhưng nó vẫn không hoạt động. Đây là truy vấn được thực thi và trả về 0 lần truy cập. "+ (())" –

+0

Hey Ed, nó có hoạt động cho các từ khóa đơn giản, không có chức năng Escape không? Nếu có, có thể đăng thêm mã liên quan đến đối tượng Searcher và QueryParser của bạn. Cũng nên nhớ rằng bạn phải tìm kiếm với cùng một Trình phân tích mà bạn sử dụng để lập chỉ mục. – Jesse

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