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 回答
1
public List<string> GetDistinctTermList(string fieldName)
    {
        List<string> list = new List<string>();

        using (IndexReader reader = idxWriter.GetReader())
        {
            TermEnum te = reader.Terms(new Term(fieldName));

            if (te != null && te.Term != null && te.Term.Field == fieldName)
            {
                list.Add(te.Term.Text);

                while (te.Next())
                {
                    if (te.Term.Field != fieldName)
                        break;
                    list.Add(te.Term.Text);
                }
            }
        }

        return list;
    }
于 2013-07-24T16:03:34.037 回答
0

老实说,我不确定是否存在,因为 Lucene 不提供“独特”的功能。我相信使用 SOLR 您可以使用构面搜索来实现这一点,但是如果您想在 Lucene 中实现这一点,则必须自己编写某种构面功能。所以只要你没有遇到任何性能问题,你应该可以这样。

于 2009-03-06T10:18:24.587 回答