21

Lucene では、TermQuery を使用してフィールドを含むテキストを検索できます。一連のフィールドまたはすべての検索可能なフィールドでキーワードを検索する方法を知りたいですか?

4

3 に答える 3

27

既に持っているもの以上にインデックスを作成したり、異なるクエリを組み合わせたりする必要のない別のアプローチは、MultiFieldQueryParser.

検索するフィールドのリストとクエリを提供できます。それだけです。

MultiFieldQueryParser queryParser = new MultiFieldQueryParser(
                Version.LUCENE_41, 
                new String[]{"title", "content", "description"},
                new StandardAnalyzer(Version.LUCENE_41));

Query query = queryParser.parse("here goes your query");

これは、Java で記述された元の lucene ライブラリで行う方法です。MultiFieldQueryParserlucene.net でも利用できるかどうかはわかりません。

于 2013-03-02T11:47:54.820 に答える
11

2つのアプローチ

1)インデックス時間アプローチ:キャッチオールフィールドを使用します。これは、すべてのフィールドのすべてのテキスト(入力ドキュメントの合計テキスト)を追加し、その結果の巨大なテキストを1つのフィールドに配置することに他なりません。キャッチオールフィールドとして機能するには、インデックス作成中にフィールドを追加する必要があります。

2)検索時のアプローチ:BooleanQueryを使用して、複数のクエリ(TermQueryインスタンスなど)を結合します。これらの複数のクエリは、すべてのターゲットフィールドをカバーするように形成できます。

記事の最後にあるチェックの例。

実行時にターゲットフィールドリストがわかっている場合は、アプローチ2を使用します。それ以外の場合は、最初のアプローチを使用する必要があります。

于 2013-03-02T03:49:06.570 に答える
5

「 MultifieldQueryParser」を使用してすべてのフィールドを検索するもう 1 つの簡単な方法は、クエリでIndexReader.FieldOption.ALLを使用することです。

これはc#の例です。

Directory directory = FSDirectory.Open(new DirectoryInfo(HostingEnvironment.MapPath(VirtualIndexPath)));

    //get analyzer
    Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_29);

    //get index reader and searcher
    IndexReader indexReader__1 = IndexReader.Open(directory, true);
    Searcher indexSearch = new IndexSearcher(indexReader__1);

    //add all possible fileds in multifieldqueryparser using indexreader getFieldNames method
    var queryParser = new MultiFieldQueryParser(Version.LUCENE_29, indexReader__1.GetFieldNames(IndexReader.FieldOption.ALL).ToArray(), analyzer);
    var query = queryParser.Parse(Criteria);
    TopDocs resultDocs = null;

    //perform search
    resultDocs = indexSearch.Search(query, indexReader__1.MaxDoc());
    var hits = resultDocs.scoreDocs;

ここをクリックして、vb.net の同じ質問に対する以前の回答を確認してください。

于 2015-07-31T23:20:21.163 に答える