Solr搜索返回部分字符串匹配

时间:2012-09-06 01:46:13

标签: java solr lucene

使用Solr 3.6.1,我在schema.xml中有这个字段:

<field name="names" type="text_general" indexed="true" stored="false" multiValued="true"/>
<dynamicField name="names_*" type="text_general" indexed="true" stored="true"/>

schema.xml中的文档声明“text_general”应该:

  • 使用StandardTokenizer进行标记化
  • 从不区分大小写的“stopwords.txt”(当前为空)中删除停用词
  • down case the string。
  • 仅在查询时,它还会应用同义词(此时也为空)

我在Solr中有两个索引的文档,其中包含该字段的数据:

<!-- doc 1 -->
<str name="names_data">Name ABC Dev Loc</str> 

<!-- doc 2 -->
<str name="names_data">Name ABC Dev Location</str>

当我执行以下查询时:

id:(doc1 OR doc2) AND names:Dev+Location)

返回两份文件。根据我对Solr的StandardTokenizer如何工作的理解,我原本预计只会返回doc2。

为什么“Dev + Location”与“Dev Loc”和“Dev Location”匹配?

2 个答案:

答案 0 :(得分:2)

类型text_general可能已配置为使用stemmer,即将Loc视为Location的变体。

您可以将类型配置为使用词干分析器,或尝试使用names:"Dev Location"

搜索整个字符串

答案 1 :(得分:0)

这可能是原因。

查询names:Dev+Location的这一部分仅搜索names:Dev的位置,因为Location字词没有字段名称限定符,它正在针对Location搜索<defaultSearchField> {1}}设置为schema.xml

因此,您可以尝试引用names:"Dev Location"之类的字段或前缀names:Dev AND names:Location