2010-03-13 33 views
13

Tôi havent sử dụng lucene. Lần trước tôi hỏi (nhiều tháng trước, có thể một năm) mọi người gợi ý sáng suốt. Nếu tôi không nên sử dụng lucene những gì tôi nên sử dụng? Như am dụ nói có các mục được gắn thẻ như thế nàyLàm cách nào để triển khai tìm kiếm thẻ? với lucene?

  1. táo cà rốt
  2. táo
  3. cà rốt
  4. chuối táo

nếu người dùng táo tìm kiếm tôi không quan tâm nếu có bất kỳ sở thích từ 1,2 và 4. Tuy nhiên tôi thấy nhiều diễn đàn làm điều này mà tôi HATED là khi một người dùng tìm kiếm cà rốt táo 2 và 3 có kết quả cao trong khi 1 là khó tìm thấy mặc dù nó phù hợp với tìm kiếm của tôi chặt chẽ hơn.

Ngoài ra tôi muốn khả năng thực hiện tìm kiếm cà rốt-ứng dụng sẽ chỉ nhận được tôi 3. Tôi không chắc chắn điều gì sẽ xảy ra nếu tôi tìm kiếm cà rốt chuối nhưng anyways miễn là các mục được gắn thẻ với 2 và 3 kết quả thấp hơn xếp hạng sau đó 1 khi tôi tìm kiếm cà rốt táo tôi sẽ được hạnh phúc.

Có thể làm được điều này không? và tôi bắt đầu từ đâu? Tôi đã thử tìm kiếm nó và khi tôi làm tôi thấy rất nhiều các lớp học và tôi sẽ thấy hướng dẫn nói về tài liệu, trang web nhưng không ai rõ ràng về những gì để làm khi tôi muốn gắn thẻ một cái gì đó. Nếu không lucene tôi nên sử dụng gì để gắn thẻ?

+2

Lucene là rất nhiều công cụ để thực hiện việc này. Nếu bạn muốn táo và táo (số nhiều) khớp, bạn chỉ cần cẩn thận khi sử dụng đúng ngôn ngữ gốc khi lập chỉ mục và truy vấn chỉ mục. – Photodeus

+1

Xếp hạng 1,2 và 4 trên từ khóa táo (giả sử bạn sẽ sử dụng stemmer để xử lý số nhiều) khác nhau bởi vì thuật toán xếp hạng tính toán trọng lượng tương đối của thuật ngữ trong trường. Trong trường hợp 2 bạn có 1 lần truy cập và độ dài trường = 1. Trong trường hợp 1 và 4 bạn có 1 lần truy cập trong trường có thời hạn 2. Nói đúng là trọng số của các lần truy cập này sẽ khác nhau theo hệ số 2. – Yaroslav

Trả lời

14

Lucene cho .net dường như đã chín muồi. Không cần phải sử dụng Java hoặc Solr

Các Standard query language for Lucene phép thuật ngữ tìm kiếm xếp hạng như nhau và phủ định

Vì vậy, nếu chỉ số Lucene bạn đã có một lĩnh vực "tag" truy vấn của bạn sẽ được

tag:apple* OR tag: carrot* 

nào sẽ cung cấp bằng xếp hạng cho mỗi từ và nhiều thứ hạng xếp hạng hơn để làm tài liệu với cả hai thẻ

Để từ chối thẻ sử dụng số này

tag:carrot* NOT tag:apple* 

Ví dụ đơn giản để hiển thị lập chỉ mục và truy vấn với Lucene here

+0

Cảm ơn :). Tôi hy vọng nhiều hơn ppl giữ này đến (tôi thực sự cần giúp đỡ!) –

+1

hướng dẫn này có vẻ tốt và liên kết truy vấn có vẻ hữu ích. Tôi nghi ngờ tôi sẽ rối tung với điều này trước khi kết thúc ngày. –

+0

Điều quan trọng ở đây (với tôi) sẽ là nếu có mối quan hệ nhiều-với-nhiều với các thẻ. tức là một mục duy nhất có thể có nhiều trường 'thẻ'. Đó thực sự là nơi sức mạnh gắn thẻ đến từ IMHO. Tôi sẽ không muốn lưu trữ các thẻ dưới dạng chuỗi các từ đơn lẻ, tức là '' 'một hai ba' '' và phải tìm kiếm '' '*** hai ***' ''. – synthesizerpatel

17

Chỉnh sửa: Bạn có thể sử dụng Lucene. Đây là một lời giải thích làm thế nào để làm điều này trong Lucene.net. Một số thông tin cơ bản về Lucene là:

  • Tài liệu - là đơn vị lưu trữ trong Lucene. Nó tương tự như một bản ghi cơ sở dữ liệu.
  • Field - đơn vị tìm kiếm trong Lucene. Tương tự với cột cơ sở dữ liệu. Lucene tìm kiếm văn bản bằng cách lấy một truy vấn và kết hợp nó với các trường. Một trường sẽ được lập chỉ mục để cho phép tìm kiếm.
  • Mã thông báo - nguyên tử tìm kiếm trong Lucene. Thông thường một từ, đôi khi là một cụm từ, chữ cái hoặc chữ số.
  • Máy phân tích - một phần của Lucene biến đổi trường thành mã thông báo.

Vui lòng đọc this blog post về cách tạo và sử dụng chỉ mục Lucene.net.

Tôi cho rằng bạn đang gắn thẻ bài đăng trên blog. Nếu tôi hoàn toàn sai, hãy nói như vậy. Để tìm kiếm các thẻ, bạn cần đại diện cho chúng dưới dạng các thực thể Lucene, cụ thể là các mã thông báo bên trong trường "thẻ".

Một cách làm như vậy là gán một tài liệu Lucene cho mỗi bài đăng trên blog. Tài liệu sẽ có ít nhất các trường sau:

  • id: id duy nhất của bài đăng trên blog.
  • nội dung: văn bản của bài đăng trên blog.
  • thẻ: danh sách thẻ.

Lập chỉ mục: Bất cứ khi nào bạn thêm thẻ vào bài đăng, xóa thẻ hoặc chỉnh sửa thẻ, bạn sẽ cần lập chỉ mục bài đăng. Trình phân tích sẽ chuyển đổi các trường thành biểu diễn mã thông báo của chúng.

Document doc = new Document(); 
doc.Add(new Field("id", i.ToString(), Field.Store.YES, Field.Index.NO)); 
doc.Add(new Field("content", text, Field.Store.YES, Field.Index.TOKENIZED)); 
doc.Add(new Field("tags", tags, Field.Store.YES, Field.Index.TOKENIZED)); 
writer.AddDocument(doc); 

Phần còn lại sẽ được truy xuất. Đối với điều này, bạn cần phải tạo ra một QueryParser và vượt qua nó một chuỗi truy vấn, như thế này:

QueryParser qp = new QueryParser(); 
Query q = qp.Parse(s); 
Hits = Searcher.Search(q); 

Cú pháp bạn cần cho s sẽ là:

tags: apples tags: carrots 

Để tìm kiếm táo hay cà rốt

tags: carrots NOT tags: apples 

Xem Lucene Query Parser Syntax để biết chi tiết về cách xây dựng s.

+0

Câu trả lời hay. Quá tệ tôi ngủ quên và không đi đến SO cho đến khi tiền thưởng kết thúc. Thêm tìm kiếm không có vẻ xấu như tôi nghĩ ban đầu. –

+0

câu trả lời hay - cách đúng để triển khai 'thẻ' là một câu hỏi quan trọng - bởi vì có rất nhiều (sai? Đau chậm?) Cách người ta có thể làm điều đó, và ý tưởng về thẻ/folksonomies là ở đây (ủng hộ phân loại phân cấp, nghĩa là) – Bobby

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