在lucene .net中查找字段的所有可用值

时间:2011-09-06 23:39:44

标签: lucene lucene.net

如果我有一个字段x,可以包含y或z等值,有没有一种方法可以查询,这样我只能返回已编入索引的值?

实施例 x可用的可设置值= test1,test2,test3,test4

第1项:字段x = test1

第2项:字段x = test2

项目3:字段x = test4

第4项:字段x = test1

执行所需的查询将返回以下列表: test1,test2,test4

5 个答案:

答案 0 :(得分:6)

之前我已将其作为扩展方法实现:

public static class ReaderExtentions
{
    public static IEnumerable<string> UniqueTermsFromField(
                                          this IndexReader reader, string field)
    {
        var termEnum = reader.Terms(new Term(field));

        do
        {
            var currentTerm = termEnum.Term();

            if (currentTerm.Field() != field)
                yield break;

            yield return currentTerm.Text();
        } while (termEnum.Next());
    }
}

你可以很容易地使用它:

var allPossibleTermsForField = reader.UniqueTermsFromField("FieldName");

这会让你回复你想要的东西。

编辑:由于一些心不在焉,我正在跳过上面的第一个学期。我已相应更新代码以正常工作。

答案 1 :(得分:1)

TermEnum te = indexReader.Terms(new Term("fieldx"));
do
{
    Term t = te.Term();
    if (t==null || t.Field() != "fieldx") break;
    Console.WriteLine(t.Text());
} while (te.Next());

答案 2 :(得分:1)

如果字段被索引为字符串或使用KeywordTokenizer并且没有过滤器索引,则可以使用构面返回字段的前N个值。这意味着该字段不是标记化的,而是保存原样。

只需在查询中设置以下属性:

facet=true
facet.field=fieldname
facet.limit=N //the number of values you want to retrieve

答案 3 :(得分:0)

我认为在字段'x'上搜索WildcardQuery,在'*'上搜索值可以做到这一点。

答案 4 :(得分:0)

我曾经使用过Lucene 2.9.2,在那里我使用了Manning的“Lucene in Action”一书中描述的FieldCache方法:

String[] fieldValues = FieldCache.DEFAULT.getStrings(indexReader, fieldname);

数组fieldValues包含字段fieldname的索引中的所有值(例如:["NY", "NY", "NY", "SF"]),因此现在由您决定如何处理数组。通常你创建一个HashMap<String,Integer>来总结每个可能值的出现次数,在这种情况下NY = 3,SF = 1。

也许这有帮助。对于非常大的索引(索引中有1.000.000个文档)来说,这是非常慢和内存消耗,但它可以工作。