【问题标题】:SOLR Case Insensitive SearchSOLR 不区分大小写的搜索
【发布时间】:2011-11-23 10:06:37
【问题描述】:

我在 SOLR 搜索中遇到问题。
我有这样的数据:

我使用 solr admin 使用这样的查询来查找这些数据:

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 中,但它仍然不起作用。我该怎么办?谁能帮帮我?

【问题讨论】:

    标签: solr case-insensitive


    【解决方案1】:

    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* 不会,因为Nadi 不会匹配索引中的nadi,您需要在客户端将查询小写。

    【讨论】:

    • 我已按照您的指示进行操作,但仍然无法正常工作。我将 &lt;field name="address_s" type="c_text" indexed="true" stored="true"/&gt; 复制粘贴到 schema.xml,然后重新运行 java -jar start.jar 并尝试查询。对不起,我想先问一下,我在..\solr_302\example\solr\conf 使用了schema.xml,对吗,.?
    • 嘿,它的工作,我需要先重新插入文档。谢谢,。你知道如何通过 PHP 定义这些字段吗?所以我不需要在 schema.xml 中手动定义它。
    • However, query address_s:*Nadi* would not, as Nadi will not match nadi in index -- 但是在&lt;analyzer type="query" /&gt; 中包含LowerCaseFilterFactory 不就是为了让查询 自动小写吗?
    • 我试过了。但它不适用于 solr 5.3.0
    【解决方案2】:

    我用这个作为字段类型:

    <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) 不支持指定分析器
    【解决方案3】:

    您的 address_s 字段是否在您的 schema.xml 中使用此 c_text 字段类型?

    如果您的索引是使用以前的配置创建的,您需要重新索引所有内容以将更改考虑在内。

    【讨论】:

    • 怎么做,.?因为我使用 php 制作所有字段。我将所有字段输入到这样的数组中: $data = array(... , 'address_s' => 'value', 'city_name_s' => 'value', ...);并使用 addDocument($data) 函数。有什么想法吗?,?
    • 那么您需要对所有已添加到索引中的文档重新运行这些命令。索引中数据的表示取决于所使用的分析器。因此,如果您更新用​​于索引的分析器,则需要重新索引所有文档。
    • 对不起,我还是不明白我应该怎么做,你能一步一步描述它吗:D,当我重新运行我的所有索引时,我应该使用 c_text 字段类型php命令,.?
    • 您唯一需要做的就是将所有文档重新插入索引。
    【解决方案4】:

    我用过这样的东西... 在 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\ *)

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2015-12-10
        • 1970-01-01
        • 1970-01-01
        • 2015-10-02
        • 2012-08-17
        • 2017-02-09
        • 1970-01-01
        • 2012-12-25
        相关资源
        最近更新 更多