Để cho phép người dùng tìm kiếm trên nhiều trường bằng Lucene 3.5, tôi hiện tạo và thêm QueryParser cho mỗi trường cần tìm kiếm DisjunctionMaxQuery. Điều này hoạt động tốt khi sử dụng HOẶC làm toán tử mặc định nhưng bây giờ tôi muốn thay đổi toán tử mặc định thành AND để nhận được kết quả chính xác hơn (và ít hơn).Lucene: Tìm kiếm nhiều trường với toán tử mặc định = AND
Sự cố là, queryParser.setDefaultOperator(QueryParser.AND_OPERATOR)
bỏ lỡ nhiều tài liệu vì tất cả các cụm từ phải nằm trong trường ít nhất 1.
Ví dụ: hãy xem xét dữ liệu sau cho tài liệu: trường tiêu đề = "Ngôn ngữ lập trình", trường nội dung = "Java, C++, PHP". Nếu người dùng tìm kiếm Lập trình Java, tài liệu cụ thể này sẽ không được đưa vào kết quả do tiêu đề cũng như trường nội dung chứa tất cả các cụm từ trong truy vấn mặc dù kết hợp chúng thực hiện. Tôi muốn tài liệu này được trả về cho truy vấn trên nhưng không cho truy vấn Lập trình HTML.
Tôi đã xem xét trường bắt giữ nhưng tôi có một vài vấn đề với nó. Đầu tiên, người dùng thường xuyên bao gồm mỗi cụm từ trường trong truy vấn của họ (tác giả: bill) mà không thể thực hiện với trường catchall. Ngoài ra, tôi làm nổi bật một số lĩnh vực với FastVectorHighlighter mà đòi hỏi chúng phải được lập chỉ mục và lưu trữ. Vì vậy, bằng cách thêm một trường catchall tôi sẽ phải lập chỉ mục hầu hết cùng một dữ liệu hai lần đó là thời gian và không gian tiêu thụ.
Bất kỳ ý tưởng nào?
Liên quan đến việc lập chỉ mục trường bắt giữ, bạn có quan sát thấy lần truy cập thời gian/không gian gây ra sự lo ngại không? Kinh nghiệm của tôi đã được lập chỉ mục cùng một dữ liệu trong một lĩnh vực được lưu trữ cụ thể, và sau đó thêm vào một lĩnh vực chỉ mục chỉ tổng quát có tác động khá tối thiểu về hiệu suất hoặc kích thước chỉ mục. – femtoRgon
Ngoài ra, tôi tự hỏi cấu trúc của truy vấn cuối trông như thế nào. Đặc biệt, cách các truy vấn dis-max được thiết lập. Dễ dàng để giết khả năng của bạn để có được điểm số có ý nghĩa với họ. – femtoRgon
@femtoRgon disjunctionMaxQuery cấu trúc là như thế này: '((tiêu đề: java title: lập trình) | (body: java body: programming)) ~ 0.2' Bạn đưa ra một điểm tốt rằng thêm một lĩnh vực catchall có thể có ít tác động như thời gian xa/không gian là có liên quan. Tôi chắc chắn đã xem xét nó nhưng quyết định chống lại nó vì tôi cũng muốn giữ khả năng tìm kiếm theo lĩnh vực, chẳng hạn như tác giả: hóa đơn. Không chỉ người dùng sử dụng tính năng này mà tôi còn sử dụng nó sau hậu trường. Cám ơn. –