4

現在、私はこのようにしています:

IndexSearcher searcher = new IndexSearcher(lucenePath);
Hits hits = searcher.Search(query);
Document doc;
List<string> companyNames = new List<string>();

for (int i = 0; i < hits.Length(); i++)
{
    doc = hits.Doc(i);
    companyNames.Add(doc.Get("companyName"));
}
searcher.Close();

companyNames = companyNames.Distinct<string>().Skip(offSet ?? 0).ToList();
return companyNames.Take(count??companyNames.Count()).ToList();

ご覧のとおり、最初にすべてのフィールド (数千) を収集してからそれらを区別し、一部をスキップして一部を削除します。

これを行うためのより良い方法があるべきだと感じています。

4

4 に答える 4

3

この質問をあなたの以前の質問 (re: 「節が多すぎます」) に結び付けると、索引リーダーからの用語の列挙を確実に確認する必要があると思います。結果をキャッシュします (フィールド名をキーにしたソート済み辞書を使用し、データとして用語のリストをフィールドごとに最大 100 用語まで使用しました)、インデックス リーダーが無効になり、移動します。

あるいは、あなたと同じような問題に直面したとき、私はそうしました。

お役に立てれば、

于 2009-03-06T10:50:24.277 に答える
1

この種の繰り返しをスキップするロジックを見つけることをお勧めしますが、コンテキストに解決策がない場合は、次のコードでパフォーマンスを向上させることができます
1) インデックス時に、繰り返したいフィールドを配置するのが最善です、最初のフィールド

Document doc = new Document();
Field companyField = new Field(...);
doc.Add(companyField);
...

2) 次に、このように FieldSelector を定義する必要があります

class CompanyNameFieldSelector : FieldSelector
{
    public FieldSelectorResult Accept(string fieldName)
    {
        return (fieldName == "companyName" ? FieldSelectorResult.LOAD_AND_BREAK : FieldSelectorResult.NO_LOAD);
    }
}

3)次に、このフィールドを繰り返して選択したい場合は、次のようにする必要があります

FieldSelector companySelector = new CompanyNameFieldSelector();
// when you iterate through your index
doc = hits.Doc(i);
doc.Get("companyName", companySelector);

上記のコードのパフォーマンスは、提供されたコードよりもはるかに優れているため、不要なドキュメント フィールドの読み取りがスキップされ、時間が節約されます。

于 2012-04-20T10:30:10.710 に答える
0

正直なところ、Lucene は「明確な」機能を提供していないため、そのような機能があるかどうかはわかりません。SOLR ではファセット検索を使用してこれを実現できると思いますが、Lucene でこれが必要な場合は、何らかのファセット機能を自分で作成する必要があります。したがって、パフォーマンスの問題が発生しない限り、この方法で問題ありません。

于 2009-03-06T10:18:24.587 に答える