2011-12-20 8 views
13

Tôi hiện đang lập chỉ mục trang web bằng cách sử dụng lucene. Mục đích là để có thể nhanh chóng trích xuất trang nào chứa một biểu thức nhất định (thường là 1, 2 hoặc 3 từ) và các từ khác (hoặc nhóm từ 1 đến 3 từ) cũng nằm trong trang. Điều này sẽ được sử dụng để xây dựng/làm phong phú/thay đổi từ điển đồng nghĩa (từ vựng cố định).Sự khác nhau giữa truy vấn cụm từ và sử dụng bộ lọc zona là gì?

Từ các bài viết tôi tìm thấy, có vẻ như vấn đề là tìm kiếm n-grams (hoặc ván lợp).

Lucene có ShingleFilter, ShingleMatrixFilterShingleAnalyzerWrapper, có vẻ liên quan đến tác vụ này.

Từ này presentation, tôi đã học được rằng Lucene cũng có thể tìm kiếm các cụm từ được phân cách bằng một số từ cố định (được gọi là slops). Một ví dụ được cung cấp here.

Tuy nhiên, tôi không hiểu rõ sự khác biệt giữa các cách tiếp cận đó? Chúng có khác biệt về cơ bản không, hay đó là lựa chọn về hiệu suất/chỉ số mà bạn phải thực hiện?

Sự khác nhau giữa ShingleMatrixFilter và ShingleFilter là gì?

Hy vọng một guru Lucene sẽ TÌM câu hỏi này và trả lời ;-)!

Trả lời

17

Sự khác biệt giữa việc sử dụng cụm từ so với bệnh zona chủ yếu liên quan đến hiệu suất và điểm.

Khi sử dụng truy vấn cụm từ (nói "thanh foo") trong trường hợp điển hình trong đó các từ đơn trong chỉ mục, truy vấn cụm từ phải đi bộ chỉ mục ngược cho "foo" và "thanh" và tìm tài liệu có chứa cả hai điều khoản, sau đó đi bộ danh sách vị trí của họ trong từng tài liệu đó để tìm những nơi "foo" xuất hiện ngay trước "thanh".

này có một số chi phí cho cả hiệu suất và chấm điểm:

  1. Positions (.prx) phải được lập chỉ mục và tìm kiếm, điều này giống như một "chiều" bổ sung cho các chỉ số đảo ngược mà sẽ tăng chỉ mục và tìm kiếm lần
  2. Vì chỉ các thuật ngữ riêng lẻ xuất hiện trong chỉ mục ngược, nên không tính toán cụm từ "IDF" thực sự (điều này có thể không ảnh hưởng đến bạn). Vì vậy, thay vì điều này là xấp xỉ dựa trên tổng của các IDFs thuật ngữ.

Mặt khác, nếu bạn sử dụng zona, bạn cũng đang lập chỉ mục từ n-gram, nói cách khác, nếu bạn đang lấn át đến kích thước 2, bạn cũng sẽ có các cụm từ như "foo bar" trong mục lục. Điều này có nghĩa cho truy vấn cụm từ này, nó sẽ được phân tích cú pháp dưới dạng một TermQuery đơn giản, mà không sử dụng bất kỳ danh sách vị trí nào. Và kể từ bây giờ là "thuật ngữ thực", cụm từ IDF sẽ chính xác, bởi vì chúng tôi biết chính xác có bao nhiêu tài liệu "thuật ngữ" này tồn tại.

Nhưng sử dụng zona đã một số chi phí cũng như:

  1. Từ điển thuật ngữ Tăng, chỉ số hạn, và danh sách đăng kích cỡ, mặc dù điều này có thể là một sự cân bằng hợp lý đặc biệt là nếu bạn hoàn toàn vô hiệu hóa vị trí hoàn toàn với Field.setIndexOptions.
  2. Một số chi phí bổ sung trong giai đoạn phân tích lập chỉ mục: mặc dù ShingleFilter được tối ưu hóa độc đáo và khá nhanh.
  3. Không có cách rõ ràng để tính toán "truy vấn cụm từ cẩu thả" hoặc kết hợp cụm từ không chính xác, mặc dù điều này có thể xấp xỉ, ví dụ:cho một cụm từ "foo bar baz" với zona của kích thước 2, bạn sẽ có hai thẻ: foo_bar, bar_baz và bạn có thể thực hiện tìm kiếm thông qua một số truy vấn khác của lucene (như BooleanQuery) cho một xấp xỉ không chính xác.

Nói chung, lập chỉ mục từ-ngrams với những thứ như Shingles hoặc CommonGrams chỉ là một sự cân bằng (khá chuyên gia), để giảm chi phí truy vấn vị trí hoặc tăng cường ghi điểm cụm từ.

Nhưng có những trường hợp sử dụng thực tế cho công cụ này, một ví dụ điển hình có sẵn ở đây: http://www.hathitrust.org/blogs/large-scale-search/slow-queries-and-common-words-part-2

+0

Cảm ơn cho câu trả lời chi tiết này (chấp nhận). Có thể bình luận về sự khác biệt giữa ShingleFilter và ShingleMatrixFilter? – blackbox

+0

Thực sự giải thích tốt. Bài viết này đã giúp tôi hiểu về bệnh zona bằng một số ví dụ: https://www.elastic.co/blog/searching-with-shingles – krinker