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

在lucene.net中查找字段的所有可用值,lucene,lucene.net,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我认为通配符查询搜索字段“x”和值“*”就可以了。如果字段被索引为字符串,或者使用关键字标记器索引而没有过滤器,则可以使用facets返回字段的前N个值。这意

如果我有一个字段x,它可以包含一个值y或z等,那么有没有一种方法可以查询,以便只返回已索引的值

范例 x可用可设置值=test1、test2、test3、test4

项目1:字段x=test1

项目2:字段x=test2

项目3:字段x=test4

第4项:字段x=test1

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

我认为通配符查询搜索字段“x”和值“*”就可以了。

如果字段被索引为字符串,或者使用关键字标记器索引而没有过滤器,则可以使用facets返回字段的前N个值。这意味着字段没有标记化,只是按原样保存

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());
只需在查询上设置以下属性:

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

我以前将其作为扩展方法实现过:

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());
    }
}
那会给你你想要的


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

我曾经使用过Lucene 2.9.2,在那里我使用了FieldCache的方法,如Manning在《Lucene在行动》一书中所述:


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

数组
fieldValues
包含字段
fieldname
索引中的所有值(例如:
[“NY”、“NY”、“NY”、“SF”]
),因此现在由您决定如何处理数组。通常,您会创建一个HashMap,该HashMap汇总每个可能值的出现次数,在本例中,NY=3,SF=1


也许这有帮助。对于非常大的索引(索引中有1.000.000个文档),它的速度非常慢并且占用内存,但是它可以工作。

如果第一个字符是“*”,则不允许使用通配符查询。对于Lucene.Net 2.9.2,至少不允许使用通配符查询。它只是很慢,因为它必须访问每个医生。术语定位第一个术语。如果您在使用下一个术语之前调用下一个术语,您将失去第一个术语。此解决方案与在Lucene中使用FieldCache的方法有何不同
String[]fieldValues=FieldCache.DEFAULT.getStrings(indexReader,fieldname)
@basZero使用TermEnum在一般情况下工作,即每个字段可能有多个值,并且不消耗内存来将值存储在缓存中。是否有Java解决方案?请注意,在lucene++中,如果读取器没有返回任何术语,则在
currentTerm.field
上此操作将失败。不确定lucene.net是否优雅地处理了这个问题。
var allPossibleTermsForField = reader.UniqueTermsFromField("FieldName");