2011-09-06 72 views
2

如果我有一个字段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

回答

0

我觉得在字段'x'和'*'的值上搜索WildcardQuery会起到诀窍的作用。

+0

如果您的第一个字符为'*',则不允许使用通配符查询。 – Dorin

+1

至少在Lucene.Net 2.9.2中不是这样。由于必须访问每个文档,所以速度很慢。 http://stackoverflow.com/questions/3412585/wildcard-at-the-beginning-of-a-searchterm-lucene – goalie7960

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()); 
+0

indexReader.Terms找到第一项。如果在访问该术语之前调用Next,则将丢失第一个术语 – guest

1

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

只需设置一个查询以下属性:

facet=true 
facet.field=fieldname 
facet.limit=N //the number of values you want to retrieve 
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"); 

这会返回你想要的。

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

+0

该解决方案与在Lucene中使用FieldCache的方法有何不同? String [] fieldValues = FieldCache.DEFAULT。getStrings(indexReader,fieldname);' – basZero

+1

@basZero使用TermEnum在一般情况下可以工作,即每个字段可能有多个值,并且不会消耗内存来将值存储在缓存中。 – Trejkaz

+0

有没有Java解决方案? – basZero

0

我曾经使用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个文档),它非常缓慢且耗费内存,但它起作用。

相关问题