2014-09-04 110 views
0

我正在使用solr.TextField而不是solr.DateField來存儲日期值。 假設我有一個「日期」字段值=「20/10/2014,20/5/2015」的記錄,我試圖搜索「20/10/2014」以獲取此記錄。但它不起作用。 我的查詢如下:q=*:*&fq=date:20/10/2014 請幫助我如何配置字段或查詢以獲取記錄。Solr文本搜索不起作用

<field name="date" type="text_general" indexed="true" stored="true"/> 

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 
+0

我只是嘗試與查詢q = *:*&fq =評論:坑/顛簸,我的評論也是像你的text_general類型,它實際上是爲我工作。我也注意到你只是:,那是爲什麼你不能得到結果? – JaredLuo 2014-09-04 06:37:05

+0

對不起,有錯別字。我使用debugQuery = true來檢查它如何分析20/10/2014。它簡單地分成日期= 20日期= 10日期= 2014年,這是行不通的。 – user2051823 2014-09-04 07:30:47

回答

1

首先:請使用正確的字段類型存儲日期,因爲這將讓你真正處理他們以適當的方式,既涉及索引,刻面,間隔時間內檢索記錄等

整個問題來自您的字段定義,它根本不適合日期處理。將TextField與StandardTokenizer一起使用會以您提供的格式對內容執行奇怪的操作,並且您將擁有太短而無法用於索引的標記。對日期應用LowerCasing和StopFiltering也不是一個好主意。

如果您確實想避免使用正確的類型,並且希望將其作爲TextField實現,則必須使其適用於您正在編入索引的內容類型。看起來你有一個由,分隔的日期列表,所以你最好用PatternTokenizer來代替 - 將每個日期分成一個單獨的標記,然後不再做任何更多的事情。

The example on the wiki由解析這個格式(通過可選的空白和,分隔的標記):

<tokenizer class="solr.PatternTokenizerFactory" pattern="\s*,\s*" /> 

由於令牌的其餘部分是你要如何查詢場部分,你不想以應用任何過濾器(並且不需要提供用於索引和查詢它們是否相同的標記器和過濾器的相同序列)。

+0

感謝您的回覆。它確實幫了很大忙。 – user2051823 2014-09-04 07:35:27