簡體   English   中英

我如何實現標簽搜索? 用lucene?

[英]How do i implement tag searching? with lucene?

我沒用過lucene。 上次我問(很多個月前,也許是一年前)人們建議使用 lucene。 如果我不應該使用 lucene,我應該使用什么? 例如,說有這樣標記的項目

  1. 蘋果 胡蘿卜
  2. 蘋果
  3. 蘿卜
  4. 蘋果香蕉

如果用戶搜索蘋果,我不在乎 1,2 和 4 是否有任何偏好。但是我看到很多論壇都這樣做,我討厭當用戶搜索蘋果胡蘿卜 2 和 3 的結果很高而 1 甚至很難找到時雖然它更符合我的搜索。

此外,我希望能夠搜索胡蘿卜 - 蘋果,這只會讓我得到 3。我不確定如果我搜索胡蘿卜香蕉會發生什么,但無論如何,只要標記為 2 和 3 結果的更多項目的排名低於 1 時我搜索蘋果胡蘿卜我會很高興的。

lucene可以做到這一點嗎? 我從哪里開始? 我嘗試查找它,當我查找它時,我會看到很多類,我會看到有關文檔、網頁的教程,但沒有人清楚當我喜歡標記某些東西時該做什么。 如果不是lucene,我應該用什么來標記?

編輯:您可以使用 Lucene。 這是如何在 Lucene.net 中執行此操作的說明。 一些 Lucene 基礎知識是:

  • 文檔 - 是 Lucene 中的存儲單元。 它有點類似於數據庫記錄。
  • Field - Lucene 中的搜索單元。 類似於數據庫列。 Lucene 通過查詢並將其與字段進行匹配來搜索文本。 應為字段編制索引以啟用搜索。
  • Token - Lucene 中的搜索原子。 通常是一個詞,有時是一個詞組、字母或數字。
  • 分析器 - Lucene 將字段轉換為標記的部分。

請閱讀這篇關於創建和使用 Lucene.net 索引的博客文章

我假設您正在標記博客文章。 如果我完全錯了,請說出來。 為了搜索標簽,您需要將它們表示為 Lucene 實體,即“標簽”字段內的標記。

這樣做的一種方法是為每個博客文章分配一個 Lucene 文檔。 該文檔至少包含以下字段:

  • id:博客文章的唯一ID。
  • 內容:博客文章的文本。
  • 標簽:標簽列表。

索引:每當您向帖子添加標簽、刪除標簽或對其進行編輯時,您都需要為帖子建立索引。 分析器會將字段轉換為它們的標記表示。

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);

剩下的部分是檢索。 為此,您需要創建一個QueryParser並向其傳遞一個查詢字符串,如下所示:

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

s 所需的語法是:

tags: apples tags: carrots

搜索蘋果或胡蘿卜

tags: carrots NOT tags: apples

有關構造 s 的詳細信息,請參閱Lucene 查詢解析器語法

用於 .net 的 Lucene 似乎已經成熟。 無需使用 Java 或 SOLR

Lucene標准查詢語言允許同等排名的搜索詞和否定

因此,如果您的 Lucene 索引有一個字段“標簽”,您的查詢將是

tag:apple* OR tag: carrot*

這將對每個單詞給予相同的排名,並為具有兩個標簽的文檔提供更多的排名權重

要否定標簽,請使用此

tag:carrot* NOT tag:apple*

在此處顯示使用 Lucene 進行索引和查詢的簡單示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM