2009-08-21 22 views
18

Tôi đang sử dụng Lucene trong cổng của tôi (dựa trên J2EE) để lập chỉ mục và tìm kiếm dịch vụ.Tìm kiếm từ khóa (OR, AND) trong Lucene

Vấn đề là về từ khóa của Lucene. Khi bạn sử dụng một trong số họ trong truy vấn tìm kiếm, bạn sẽ gặp lỗi.

Ví dụ:

searchTerms = "ik OR jij" 

này hoạt động tốt, bởi vì nó sẽ tìm kiếm "ik" hoặc "jij"

searchTerms = "ik AND jij" 

này hoạt động tốt, nó tìm kiếm "ik""jij"

Nhưng khi bạn tìm kiếm:

searchTerms = "OR" 
searchTerms = "AND" 
searchTerms = "ik OR" 
searchTerms = "OR ik" 

vv, nó sẽ thất bại với một lỗi:

 
Component Name: STSE_RESULTS Class: org.apache.lucene.queryParser.ParseException Message: Cannot parse 'OR jij': Encountered "OR" at line 1, column 0. 
Was expecting one of: 
... 

Nó có ý nghĩa, bởi vì những lời này là từ khóa cho Lucene có lẽ dự trữ và sẽ hoạt động như từ khóa.

Ở Hà Lan, từ "OR" là quan trọng vì nó có ý nghĩa cho "Ondernemings Raad". Nó được sử dụng trong nhiều bản văn, và nó cần phải được tìm thấy. Ví dụ "hoặc" không hoạt động, nhưng không trả về các văn bản khớp với cụm từ "HOẶC". Làm thế nào tôi có thể làm cho nó có thể tìm kiếm được?

Làm cách nào để thoát khỏi từ khóa "hoặc"? Hoặc Làm cách nào tôi có thể yêu cầu Lucene coi "hoặc" là cụm từ tìm kiếm KHÔNG phải là từ khóa.

+0

phiên bản nào của Lucene? AFAIk, truy vấn Boolean hoạt động cho tôi với BooleanClause.Occur.SHOULD | PHẢI | MUSTNOT (OR | AND | NOT) resp. – Narayan

+0

hiện công việc tìm kiếm trong Luke ==> http://www.getopt.org/luke/ – Narayan

Trả lời

-1

Bạn có thể thoát khỏi "OR" khi đó là cụm từ tìm kiếm hoặc viết trình phân tích cú pháp truy vấn của bạn theo một cú pháp khác. Lucene cung cấp một API truy vấn mở rộng ngoài trình phân tích cú pháp, mà bạn hỗ trợ cú pháp truy vấn của riêng bạn khá dễ dàng.

+3

Làm thế nào để thoát khỏi nó? – Areca

0

Có thể bạn đang làm điều gì đó sai khi xây dựng truy vấn. Tôi sẽ đề nghị Narayan thứ hai về việc nhận được Luke (như được đăng trong các bình luận) và thử chạy các truy vấn của bạn với điều đó. Nó đã được một thời gian ngắn kể từ khi tôi sử dụng Lucene, nhưng tôi không nhớ bao giờ có vấn đề với OR và AND.

Ngoài ra, bạn có thể thử thoát khỏi chuỗi đầu vào sử dụng QueryParser.escape (userQuery)

More On Escaping

+0

Tôi đã cố gắng thoát nhưng nó không hoạt động. –

1

Tôi đã đọc câu hỏi nhiều thời gian của bạn! = [

hãy xem các đề xuất này

Chỉ mục của bạn được lưu trữ như thế nào?

Fields tài liệu có chứa lưu trữ có thể được lưu trữ như

1) lưu trữ 2) tokenized 3) được lập chỉ mục 4) Vector

nó có thể làm cho một ý nghĩa difference

xin vui lòng sử dụng Luke, nó có thể cho bạn biết cách các chỉ mục của bạn được lưu trữ (thực sự)

Luke là phải có nếu bạn đang làm việc với lucene, vì nó cung cấp cho bạn một ý tưởng thực sự về cách các chỉ mục được lưu trữ, nó cũng cung cấp tìm kiếm, hãy thử nó cho chúng tôi biết với bản cập nhật của bạn!

4

Tôi cho rằng bạn đã thử đặt dấu "HOẶC" vào dấu ngoặc kép?

Nếu điều đó không hoạt động, tôi nghĩ bạn có thể phải đi xa để thay đổi nguồn Lucene và sau đó biên dịch lại toàn bộ điều, vì toán tử "OR" được chôn sâu bên trong mã. Trên thực tế, việc biên dịch có lẽ không đủ, bạn sẽ phải thay đổi tệp QueryParser.jj trong gói nguồn đóng vai trò là đầu vào cho JavaCC, sau đó chạy JavaCC, sau đó biên dịch lại toàn bộ.

Tin tốt, tuy nhiên, đó là chỉ có một dòng để thay đổi:

| <OR: ("OR" | "||") >

trở thành

| <OR: ("||") >

Bằng cách đó, bạn sẽ phải chỉ "||" là toán tử OR logic. Có tệp build.xml cũng chứa lời gọi JavaCC, nhưng bạn phải tự tải xuống that tool. Tôi không thể thử nó ngay bây giờ, tôi sợ.

Đây có lẽ là một câu hỏi hay cho các nhà phát triển mailing list Lucene, nhưng xin vui lòng cho chúng tôi biết nếu bạn làm điều đó và họ tìm ra một giải pháp đơn giản hơn ;-)

2

HOẶC, KHÔNGAND là các từ khóa được đặt trước. Tôi đã giải quyết vấn đề này chỉ 2 ngày trước bằng cách hạ thấp 3 từ đó trong thuật ngữ tìm kiếm của người dùng trước khi đưa nó vào trong trình phân tích cú pháp truy vấn. Lưu ý rằng nếu bạn tìm kiếm và thay thế cho các từ khóa này, hãy đảm bảo bạn sử dụng các ranh giới từ (\ b) để bạn không kết thúc việc thay đổi các từ như ANDROID và ORDER.

Tôi sau đó cho phép người dùng chỉ định NOTAND bằng cách sử dụng - và +, giống như Google.

3

Thoát OR và VÀ có dấu ngoặc kép làm việc cho tôi. Vì vậy, hãy thử với một chuỗi Java như

String query = "field:\"AND\"";

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