15

私はLuceneを使用していません。前回私が尋ねたとき(何ヶ月も前、多分一年前)、人々はluceneを提案しました。Luceneを使用すべきでない場合、何を使用する必要がありますか?例として、このようにタグ付けされたアイテムがあると言います

  1. りんごにんじん
  2. りんご
  3. 人参
  4. アップルバナナ

ユーザーがリンゴを検索する場合、1、2、4からの好みがあるかどうかは気にしません。しかし、多くのフォーラムがこれを行っているのを見ました。それは私の検索とより密接に一致しますが。

また、ニンジンを検索する機能が欲しいのですが、リンゴは3つしか取得できません。ニンジンのバナナを検索するとどうなるかわかりませんが、2と3の結果でタグ付けされたアイテムのランクが1よりも低い場合はとにかくりんごにんじんを検索して幸せになります。

luceneはこれを行うことができますか?どこから始めればいいですか?私はそれを調べてみました、そして私がそうするとき、私はたくさんのクラスを見ます、そして私はドキュメント、ウェブページについて話しているチュートリアルを見ます、しかし私が何かにタグを付けるのが好きなとき何をすべきかについてはっきりしていませんでした。Luceneでない場合、タグ付けには何を使用すればよいですか?

4

2 に答える 2

17

編集:Luceneを使用できます。Lucene.netでこれを行う方法の説明は次のとおりです。Luceneの基本は次のとおりです。

  • ドキュメント-Luceneのストレージユニットです。これは、データベースレコードにいくぶん似ています。
  • フィールド-Luceneの検索ユニット。データベース列に類似しています。Luceneは、クエリを取得してフィールドと照合することにより、テキストを検索します。検索を有効にするには、フィールドにインデックスを付ける必要があります。
  • トークン-Luceneの検索アトム。通常は単語、場合によってはフレーズ、文字、または数字。
  • アナライザー-フィールドをトークンに変換するLuceneの一部。

Lucene.netインデックスの作成と使用については、このブログ投稿をお読みください。

ブログの投稿にタグを付けていると思います。私が完全に間違っているなら、そう言ってください。タグを検索するには、タグをLuceneエンティティとして、つまり「タグ」フィールド内のトークンとして表す必要があります。

そのための1つの方法は、ブログ投稿ごとに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

の構築の詳細については、Luceneクエリパーサー構文を参照してください。

于 2010-03-14T15:33:08.050 に答える
16

Lucenefor.netは成熟しているようです。JavaやSOLRを使用する必要はありません

Luceneの標準クエリ言語では、同じランクの検索用語と否定が可能です

したがって、Luceneインデックスにフィールド「タグ」がある場合、クエリは次のようになります。

tag:apple* OR tag: carrot*

これにより、各単語に同等のランクが付けられ、両方のタグを使用してドキュメントにランクの重み付けが大きくなります。

タグを無効にするには、これを使用します

tag:carrot* NOT tag:apple*

Luceneを使用したインデックス作成とクエリをここに示す簡単な例

于 2010-03-22T20:52:56.837 に答える