2014-09-04 75 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