2010-09-14 173 views

回答

5

如果您知道存儲在您的字段中的數據的類型,則可以嘗試範圍查詢。根據示例,如果您的字段包含字符串數據,那麼像field:[a* TO z*]這樣的查詢將返回該字段中存在字符串值的所有文檔。

+0

這應該工作。如果字段的值以數字或大寫字母開頭,則會稍微複雜一些。 OR查詢應該很容易做到。 – 2010-09-14 16:58:53

+0

好點!但是如果它以大寫開頭,那麼以*開頭的範圍應該可以捕捉它,因爲TermRangeQuery的javadoc聲明它使用String.compareTo來確定字符串是否是範圍的一部分。 – 2010-09-14 17:13:03

+0

這看起來不錯。不知道從數字開始捕捉記錄,但這是一個好的開始。謝謝! – 2010-09-14 17:33:55

3

我已經做了一些試驗,似乎實現這一目標的最簡單的方法是創建一個QueryParser並調用SetAllowLeadingWildcard(true)和搜索field:*像這樣:

var qp = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, field, analyzer); 
qp.SetAllowLeadingWildcard(true); 
var query = qp.Parse("*")); 

(請注意我設置默認字段的QueryParserfield在其構造函數中,因此在Parse()中僅搜索"*")。

我不能保證這種方法的效率有多高是其它方法相比,但作爲我能找到的最簡單的方法,我希望它至少與field:[* TO *]高效,而且避免了不得不做的hackish之類的東西field:[0* TO z*] ,這可能不會考慮所有可能的值,例如以非字母數字字符開頭的值。

1

另一種解決方案是使用ConstantScoreQuery與FieldValueFilter

new ConstantScoreQuery(new FieldValueFilter("field")) 
相關問題