2013-02-22 21 views
6

Máy phân tích tiêu chuẩn không hoạt động. Từ những gì tôi có thể hiểu, điều này sẽ thay đổi điều này thành tìm kiếm cnetCách tùy chỉnh Lucene.NET để tìm kiếm các từ có ký hiệu không có phân biệt chữ hoa chữ thường (ví dụ: "C#" hoặc ".net")?

WhitespaceAnalyzer sẽ hoạt động nhưng có phân biệt chữ hoa chữ thường.

Quy tắc chung là tìm kiếm sẽ hoạt động như Google, vì vậy hy vọng đó là điều cấu hình xem xét .net, c# đã được thực hiện ở đó một thời gian hoặc có giải pháp cho việc này.

Theo các đề xuất bên dưới, tôi đã thử tùy chỉnh WhitespaceAnalyzer nhưng sau đó nếu từ khóa được phân tách bằng dấu phẩy và không gian không được xử lý chính xác, ví dụ:

java,.net,c#,oracle 

sẽ không được trả lại trong khi tìm kiếm sẽ không chính xác.

Tôi đã xem qua số PatternAnalyzer được sử dụng để chia mã thông báo nhưng không thể tìm ra cách sử dụng nó trong trường hợp này.

Tôi đang sử dụng Lucene.Net 3.0.3.NET 4.0

+0

là mã nguồn miền của bạn? Hay chỉ là những ví dụ? – phani

+0

@phani đó chỉ là ví dụ – Kumar

Trả lời

-2

cho những người khác có thể tìm kiếm một câu trả lời cũng

câu trả lời chính thức quay ra được để tạo ra một TokenFilter tùy chỉnh và một Analyzer tùy chỉnh sử dụng rằng mã thông báo bộ lọc cùng với Whitespacetokenizer, lowercasefilter vv, tất cả trong tất cả khoảng 30 dòng mã, tôi sẽ tạo một bài đăng trên blog và đăng liên kết tại đây khi tôi làm, phải tạo một blog đầu tiên!

+0

Xin chào bất kỳ cơ hội nào bạn có thể xuất bản nó trên Gist? Nghe có vẻ rất hữu ích – mcintyre321

7

Viết lớp phân tích riêng của bạn tương tự như SynonymAnalyzer trong Lucene.Net – Custom Synonym Analyzer. Ghi đè của bạn về TokenStream có thể giải quyết vấn đề này bằng cách pipelining luồng bằng cách sử dụng WhitespaceTokenizerLowerCaseFilter.

Hãy nhớ rằng người lập chỉ mục và người tìm kiếm của bạn cần phải sử dụng cùng một trình phân tích.

Cập nhật: Xử lý nhiều từ khóa bằng dấu phẩy phân

Nếu bạn chỉ cần để xử lý các từ khóa bằng dấu phẩy phân unspaced cho tìm kiếm, không lập chỉ mục thì bạn có thể chuyển đổi các biểu thức tìm kiếm expr như dưới đây.

expr = expr.Replace(',', ' '); 

Sau đó, chuyển expr đến QueryParser. Nếu bạn muốn hỗ trợ các dấu phân tách khác như ';' bạn có thể làm điều đó như thế này:

var terms = expr.Split(new char[] { ',', ';'}); 
expr = String.Join(" ", terms); 

Nhưng bạn cũng cần phải kiểm tra một biểu thức cụm từ như "Sybase, C# ,. net, oracle" (biểu hiện bao gồm các trích dẫn "chars) mà không nên được chuyển đổi (các dùng đang tìm kiếm một kết hợp chính xác):

expr = expr.Trim(); 
if (!(expr.StartsWith("\"") && expr.EndsWith("\""))) 
{ 
    expr = expr.Replace(',', ' '); 
} 

biểu thức có thể bao gồm cả một cụm từ và một số từ khóa, như thế này:

"sybase,c#,.net,oracle" server,c#,.net,sybase 

Sau đó, bạn cần phải phân tích và dịch biểu thức tìm kiếm này:

"sybase,c#,.net,oracle" server c# .net sybase 

Nếu bạn cũng cần phải xử lý từ khóa bằng dấu phẩy phân unspaced cho indexing thì bạn cần phải phân tích văn bản cho các từ khóa bằng dấu phẩy phân unspaced và lưu trữ chúng trong một lĩnh vực ví dụ rõ rệt. Keywords (phải được liên kết với bộ phân tích tùy chỉnh của bạn).Sau đó xử lý tìm kiếm của bạn cần phải chuyển đổi một biểu thức tìm kiếm như thế này:

server,c#,.net,sybase 

này:

Keywords:server Keywords:c# Keywords:.net, Keywords:sybase 

hoặc đơn giản hơn:

Keywords:(server, c#, .net, sybase) 
+0

đã thử nhưng sau đó nó không nhận ra các từ khóa như oracle, .net, C#, sybase ... được thực hiện bởi google - tiêu chuẩn vàng cho người dùng của chúng tôi như nó, sẽ xem thêm thông tin có lẽ tùy biến tokenizer nếu có thể – Kumar

+0

Thêm chi tiết vào Ques – Kumar

+0

điều này là cần thiết để tìm kiếm và lập chỉ mục, ý tưởng thú vị về phân tích cú pháp thành một trường riêng biệt nhưng đó sẽ là nhiều công việc xem xét chúng tôi sẽ phải xử lý nói .net4/.net4.5 vv chứ không phải là một .net * (im lặng) tìm kiếm vv Nếu tôi không thể tìm ra một cách để tùy chỉnh các tokenizer sau đó sẽ phải làm một cái gì đó như thế này – Kumar

4

Sử dụng WhitespacerAnalyzer và chuỗi nó với một LowerCaseFilter .

Sử dụng cùng một chuỗi tại thời gian tìm kiếm và chỉ mục. bằng cách chuyển đổi mọi thứ thành chữ thường, bạn thực sự làm cho nó không phân biệt chữ hoa chữ thường.

Theo mô tả sự cố của bạn, điều đó sẽ hoạt động và đơn giản để triển khai.

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