如果我有一个字段x,它可以包含y或z等值,是否有一种方法可以查询,以便我只能返回具有被索引?在lucene中查找一个字段的所有可用值.net
例 X可用的可设置值= TEST1,TEST2,TEST3,TEST4
项目1:字段X = TEST1
项目2:字段X = TEST2
项目3:字段X = TEST4
项目4:域X = test1的
执行所需的查询将返回一个列表: test1,test2,test4
如果我有一个字段x,它可以包含y或z等值,是否有一种方法可以查询,以便我只能返回具有被索引?在lucene中查找一个字段的所有可用值.net
例 X可用的可设置值= TEST1,TEST2,TEST3,TEST4
项目1:字段X = TEST1
项目2:字段X = TEST2
项目3:字段X = TEST4
项目4:域X = test1的
执行所需的查询将返回一个列表: test1,test2,test4
我觉得在字段'x'和'*'的值上搜索WildcardQuery会起到诀窍的作用。
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());
indexReader.Terms找到第一项。如果在访问该术语之前调用Next,则将丢失第一个术语 – guest
如果字段被索引为字符串或使用KeywordTokenizer进行索引并且没有过滤器,则可以使用构面返回字段的前N个值。这意味着该字段不会被标记,而是保存原样。
只需设置一个查询以下属性:
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());
}
}
你可以非常容易地使用它像这样:
var allPossibleTermsForField = reader.UniqueTermsFromField("FieldName");
这会返回你想要的。
编辑:我正在跳过上面的第一个词,由于一些心不在焉。我相应地更新了代码以正常工作。
我曾经使用Lucene的2.9.2还有我用的FieldCache的办法由曼宁在书中“的Lucene在行动”中描述:
String[] fieldValues = FieldCache.DEFAULT.getStrings(indexReader, fieldname);
数组fieldValues
包含了所有值字段fieldname
(例如:["NY", "NY", "NY", "SF"]
)的索引,所以现在由您决定如何处理数组。通常你创建一个HashMap<String,Integer>
,总结每个可能值的出现次数,在这种情况下,NY = 3,SF = 1。
也许这会有所帮助。对于非常大的索引(索引中有1.000.000个文档),它非常缓慢且耗费内存,但它起作用。
如果您的第一个字符为'*',则不允许使用通配符查询。 – Dorin
至少在Lucene.Net 2.9.2中不是这样。由于必须访问每个文档,所以速度很慢。 http://stackoverflow.com/questions/3412585/wildcard-at-the-beginning-of-a-searchterm-lucene – goalie7960