2012-04-17 34 views
10

Tôi đang gặp sự cố với chỉ mục Lucene, chỉ mục có từ được lập chỉ mục, chứa ký tự "-".Vấn đề chỉ mục Lucene với ký tự "-"

Nó hoạt động cho một số từ chứa "-" nhưng không phải cho tất cả và tôi không tìm thấy lý do, tại sao nó không hoạt động.

Trường tôi đang tìm kiếm, được phân tích và chứa phiên bản của từ có và không có ký tự "-".

Tôi đang sử dụng máy phân tích: org.apache.lucene.analysis.standard.StandardAnalyzer

đây một ví dụ:

nếu tôi tìm kiếm "gsx- *" Tôi có Kết quả là, lập chỉ mục trường có chứa "SUZUKI GSX-R 1000 GSX-R1000 GSXR"

nhưng nếu tôi tìm kiếm "v- *", tôi không nhận được kết quả nào. Trường được lập chỉ mục của kết quả mong muốn chứa: "SUZUKI DL 1000 V-STROM DL1000V-STROMVSTROM V STROM"

Nếu tôi tìm kiếm "v-strom" không có "*", nhưng nếu tôi chỉ tìm kiếm " v-str "ví dụ tôi không nhận được kết quả. (Nên có kết quả bởi vì đó là tìm kiếm trực tiếp cho một webshop)

Vì vậy, sự khác nhau giữa 2 kết quả mong đợi là gì? tại sao nó hoạt động cho "gsx- " nhưng không hoạt động cho "v-"?

+0

Thú vị, tôi làm việc với Solr và lái xe V-Strom 650 :) –

+1

Bạn đã thực sự kiểm tra nội dung của trường được lập chỉ mục hay bạn chỉ mong đợi nó sẽ như thế? Nếu không sử dụng công cụ chỉ mục Lucene lớn nhất từ ​​trước tới giờ - Luke: http://code.google.com/p/luke/ –

+0

có, tôi hiển thị cùng một trường mà tôi đang tìm kiếm trong – Zteve

Trả lời

12

StandardAnalyzer sẽ coi dấu gạch ngang là khoảng trống, tôi tin. Vì vậy, nó sẽ chuyển truy vấn của bạn "gsx-*" thành "gsx*""v-*" thành không có gì vì cũng loại bỏ mã thông báo một chữ cái. Nội dung của trường trong kết quả tìm kiếm là giá trị được lưu trữ của trường, điều này hoàn toàn độc lập với các cụm từ được lập chỉ mục cho trường đó.

Vì vậy, điều bạn muốn dành cho "v-strom" nói chung là thuật ngữ được lập chỉ mục. StandardAnalyzer không phù hợp với loại văn bản này. Có thể đi với WhitespaceAnalyzer hoặc SimpleAnalyzer. Nếu điều đó vẫn không cắt nó, bạn cũng có tùy chọn để ném cùng một máy phân tích của riêng bạn, hoặc chỉ bắt đầu từ hai người đó và sáng tác chúng với hơn TokenFilters. Một lời giải thích rất tốt được đưa ra trong the Lucene Analysis package Javadoc.

BTW không cần phải nhập tất cả các biến thể trong chỉ mục, như V-strom, V-Strom, v.v ... Ý tưởng là cho cùng một máy phân tích để chuẩn hóa tất cả các biến thể này thành cùng một chuỗi cả trong chỉ mục và trong khi phân tích cú pháp truy vấn.

+0

Cảm ơn sự giúp đỡ của bạn, tôi biết rằng hiển thị giá trị là độc lập từ trường tìm kiếm/lập chỉ mục, nhưng để kiểm tra tôi đã hiển thị trường tôi đang tìm kiếm. Tôi cũng sử dụng luke để kiểm tra và phân tích vấn đề. Vì vậy, những gì tôi chính xác cần là, rằng khách hàng có thể gõ v- và nhận được tất cả các kết quả bắt đầu với v-. Tôi cần phải thay đổi gì, nó có hiệu quả không? Tôi chỉ cần cú pháp đúng để tôi có thể thay đổi truy vấn của khách hàng – Zteve

+0

Tôi hơi bị gỉ với Solr, nhưng tôi bắt đầu bằng cách thêm một trường bổ sung vào lược đồ của bạn (ví dụ: product_name) mà bạn chỉ nên viết thường (trường type = chữ thường). Thêm trường này (OR) vào url yêu cầu tìm kiếm của bạn làm thông số bổ sung có trọng số cao hơn. –

+0

loại cú pháp/giá trị nào nên ở trong trường product_name này? cùng một nội dung như trong trường được lập chỉ mục thực tế? Cũng có thể thay đổi giá trị của trường được lập chỉ mục, vì tôi có thể thay đổi giá trị thành "V-STROM v-strom vstrom v strom V STROM", có thể thay đổi giá trị đưa ra giải pháp không?Điều cố định duy nhất là, khách hàng sẽ có thể tìm thấy kết quả khi anh ta gõ "v-str" hoặc "v-" vv trong trường tìm kiếm. – Zteve

3

ClassicAnalyzer xử lý '-' làm ký tự hữu ích, không phân cách. Theo tôi hiểu ClassicAnalyzer, nó xử lý '-' như StandardAnalyzer trước 3.1 vì ClassicAnalyzer sử dụng ClassicTokenizer xử lý các số có nhúng '-' làm mã sản phẩm, vì vậy toàn bộ điều được mã hóa là một thuật ngữ.

Khi tôi ở tại Học viện Regenstrief, tôi nhận thấy điều này sau khi nâng cấp Luke, như các thuật ngữ y tế LOINC chuẩn (LOINC được bắt đầu bởi RI) được xác định bằng một số theo sau là '-' và một checkdigit, như '1-8 'hoặc' 2857-1 '. Tìm kiếm của tôi cho LOINCs như '45963-6' không thành công khi sử dụng StandardAnalyzer trong Luke 3.5.0, nhưng đã thành công với ClassicAnalyzer (và điều này là do chúng tôi đã xây dựng chỉ mục với phiên bản 2.9.2 Lucene.NET).

+0

Tôi vừa thử và như Lucene 4.0.0 WhitespaceAnalyzer sẽ không loại bỏ dấu gạch ngang, mà là ý chí tiêu chuẩn và cổ điển. –

1

ClassicAnalzer được khuyến nghị lập chỉ mục văn bản chứa mã sản phẩm như 'GSX-R1000'. Nó sẽ nhận ra điều này như là một thuật ngữ duy nhất và không phân chia các phần của nó.Nhưng ví dụ, văn bản 'Châu Âu/Berlin' sẽ được chia thành ClassicAnalzer thành các từ 'Châu Âu' và 'Berlin'. Điều này có nghĩa là nếu bạn có một văn bản được chỉ mục bởi ClassicAnalyzer có chứa cụm từ

Europe/Berlin GSX-R1000 

bạn có thể tìm kiếm "europe", "berlin" hoặc "GSX-R1000".

Nhưng hãy cẩn thận máy phân tích bạn sử dụng cho tìm kiếm. Tôi nghĩ lựa chọn tốt nhất để tìm kiếm chỉ mục Lucene là KeywordAnalyzer. Với KeywordAnalyzer bạn cũng có thể tìm kiếm các lĩnh vực cụ thể trong một tài liệu và bạn có thể xây dựng các truy vấn phức tạp như:

(processid:4711) (berlin) 

Truy vấn này sẽ tìm kiếm các tài liệu bằng cụm từ 'berlin' mà còn là một lĩnh vực 'ProcessID' chứa số 4711

Nhưng nếu bạn tìm kiếm chỉ mục cho cụm từ "europe/berlin", bạn sẽ không nhận được kết quả nào! Điều này là do KeywordAnalyzer không thay đổi cụm từ tìm kiếm của bạn, nhưng cụm từ 'Europe/Berlin' được chia thành hai từ riêng biệt bởi ClassicAnalyzer. Điều này có nghĩa là bạn phải tìm kiếm 'europe' và 'berlin' một cách riêng biệt.

Để giải quyết mâu thuẫn này, bạn có thể dịch cụm từ tìm kiếm, nhập vào bởi người sử dụng, trong một truy vấn tìm kiếm phù hợp với nhu cầu của bạn bằng cách sử dụng đoạn mã sau:

QueryParser parser = new QueryParser("content", new ClassicAnalyzer()); 
Query result = parser.parse(searchTerm); 
searchTerm = result.toString("content"); 

Mã này sẽ dịch các pharse serach

Europe/Berlin 

vào

europe berlin 

đó sẽ dẫn đến việc thiết lập tài liệu dự kiến .

Lưu ý: Điều này cũng sẽ hoạt động đối với các tình huống phức tạp hơn. Thuật ngữ tìm kiếm

Europe/Berlin GSX-R1000 

sẽ được dịch sang:

(europe berlin) GSX-R1000 

mà sẽ tìm kiếm một cách chính xác cho tất cả các cụm từ kết hợp sử dụng KeyWordAnalyzer.

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