如果我有一个字段x,可以包含y或z等值,有没有一种方法可以查询,这样我只能返回已编入索引的值?
实施例 x可用的可设置值= test1,test2,test3,test4
第1项:字段x = test1
第2项:字段x = test2
项目3:字段x = test4
第4项:字段x = test1
执行所需的查询将返回以下列表: test1,test2,test4
答案 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个文档)来说,这是非常慢和内存消耗,但它可以工作。