2011-09-06 50 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個文檔),它非常緩慢且耗費內存,但它起作用。

相關問題