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