SOLR不区分大小写搜索

18

我在SOLR搜索中遇到了问题。
我的数据如下所示:
enter image description here

我使用Solr管理界面使用以下查询来查找这些数据:

address_s:*Nadi*

我找到了那些数据。但是当我使用这个查询时:

address_s:*nadi*

它没有找到任何东西。
我已经谷歌了一下,找到了一个用以下脚本创建字段的答案:

<fieldType name="c_text" class="solr.TextField">
    <analyzer type="index">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>

    <analyzer type="query">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
</fieldType>

我已经将这些脚本复制粘贴到schema.xml中,但仍然无法工作。我该怎么办?有人可以帮帮我吗?

5个回答

12

我使用了这个作为字段类型:

<fieldType name="string" class="solr.TextField">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

然后我使用以下方式定义了我的字段:

<field name="address" type="string" indexed="true" stored="true"/>

结果:我的文档返回正确的大小写字段(例如已插入的)并且可以进行大小写不敏感的搜索(使用大写和小写字母)...

版本:Solr 3.6


@ Jeff Maes 这个出错了。"string": FieldType: StrField (string) 不支持指定分析器。 - Jenish

12

address_s字段应该被定义为 -

<field name="address_s" type="c_text" indexed="true" stored="true"/>
如果您使用的是默认的schema.xml文件,则此定义应该放在"-"之前。
<dynamicField name="*_s"  type="string"  indexed="true"  stored="true"/>

该字段类型为字符串类型且不进行分析。

通配符查询不会进行分析。
因此,如果您在索引时间应用小写过滤器,则查询address_s:*nadi*将起作用。
但是,查询address_s:*Nadi*则不会起作用,因为索引中的Nadinadi不匹配,您需要在客户端上将查询转换为小写。


2
我按照您的指示操作了,但仍然无法正常工作。我将<field name="address_s" type="c_text" indexed="true" stored="true"/>复制粘贴到schema.xml中,并重新运行了java -jar start.jar,并尝试了查询。抱歉,我想先问一下,我使用的是..\solr_302\example\solr\conf下的schema.xml,这样对吗? - Praditha
嘿,它能工作,但我需要先重新插入文档。谢谢。 你知道如何通过PHP定义这些字段吗?这样我就不需要手动在schema.xml中定义了。 - Praditha
7
“但是,查询地址_s:Nadi将不会匹配索引中的nadi,因为Nadi与nadi不匹配。”-- 但是<analyzer type="query" />中使用LowerCaseFilterFactory的目的不就是自动将查询转换为小写吗? - Madbreaks
我尝试过这个。但它不适用于solr 5.3.0。 - aasha

5

你的schema.xml文件中的address_s字段是否使用了c_text字段类型?

如果你的索引已经按照之前的配置创建完成,那么你需要重新索引所有内容以使更改生效。


怎么做呢?因为我是用 PHP 制作所有字段的。我将所有字段输入到数组中,就像这样:$data = array(... , 'address_s' => 'value', 'city_name_s' => 'value', ...);然后使用 addDocument($data) 函数。有什么想法吗? - Praditha
3
您需要针对已添加到索引中的所有文档重新运行这些命令。索引中数据的表示取决于使用的分析器。因此,如果您更新用于索引的分析器,则需要重新索引所有文档。 - jpountz
抱歉,我仍然不明白我应该做什么,您能逐步描述一下吗:D?当我重新运行我的PHP命令时,我应该在所有索引中使用c_text字段类型吗? - Praditha
2
使其正常工作的唯一方法是重新将所有文档插入索引。 - jpountz

1

不要定义字段为 type="string",而是定义为 type="text_general"(在默认的 schema.xml 中已定义)。其中一个属性是 ignore case=true


1
我曾使用过类似这样的东西... 在schema.xml中,我添加了一个新的fieldType。
<fieldType name="newType" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.ReversedWildcardFilterFactory" />
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.ReversedWildcardFilterFactory" />
      </analyzer>
 </fieldType>

将新类型分配给您想要使其不区分大小写和空格的字段,然后必须以以下形式构造solr查询: fieldName:(*fieldValue\ *)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接