【问题标题】:SOLR Case Insensitive Field search issueSOLR 不区分大小写的字段搜索问题
【发布时间】:2017-02-09 19:40:24
【问题描述】:

我想要实现的是,当我搜索test 时,我也可以通过不区分大小写的搜索将Test, TeSt, TesT,TEST 带给我。 我该怎么办?

我的 schema.xml 中有这个 textgen 类型,分配给 test_field

<fieldType name="textgen" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="0"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.StopFilterFactory"
            ignoreCase="true"
            words="stopwords.txt"
            enablePositionIncrements="true"
            />
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="select">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.StopFilterFactory"
            ignoreCase="true"
            words="stopwords.txt"
            enablePositionIncrements="true"
            />
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

这是我希望通过查询获得的结果。

{
  "responseHeader":{
    "status":0,
    "QTime":2,
    "params":{
      "q":"test_field:*",
      "indent":"true",
      "wt":"json"}},
  "response":{"numFound":5,"start":0,"docs":[
      {
        "id":"change.me",
        "test_field":["test"],
        "_version_":1546932094148542464},
      {
        "id":"change.me1",
        "test_field":["tesT"],
        "_version_":1546932100203020288},
      {
        "id":"change.me2",
        "test_field":["TesT"],
        "_version_":1546932103122255872},
      {
        "id":"change.me3",
        "test_field":["TEsT"],
        "_version_":1546932107768496128},
      {
        "id":"change.me4",
        "test_field":["TEST"],
        "_version_":1546932111283322880}]
  }}

当我使用此查询时,它不会给出任何结果,因为它区分大小写,即使它具有过滤器 LowerCaseFilterFactory

http://localhost:8983/solr/test-data/select?q=test_field:*test*&amp;wt=json&amp;indent=true

AND 空结果。 (我做错了什么?)

{
  "responseHeader":{
    "status":0,
    "QTime":2,
    "params":{
      "q":"test_field:*test*",
      "indent":"true",
      "wt":"json"}},
  "response":{"numFound":1,"start":0,"docs":[
      {
        "id":"change.me",
        "test_field":["test"],
        "_version_":1546932094148542464}]
  }}

【问题讨论】:

  • 添加过滤器后需要重新索引文档。所以请在重新索引文档后检查查询。
  • 我创建了一个新架构并且它工​​作正常,我认为我的旧 solr 架构中有些东西搞砸了。

标签: search solr case-insensitive


【解决方案1】:

您是否真的在搜索字词的两端添加了星号(通配符)?你不应该这样做。 Solr 配置的全部意义在于以一种无需通配符即可搜索单词的方式标记您的文本。

如果您只是在文本中搜索作品,它应该可以包括混合大小写匹配。如果不是,请检查您的字段是否实际映射到正确的类型以及您是否已重新编制索引。如果仍然感到困惑,Solr Admin UI 有一个分析屏幕,您可以在其中选择您的字段(或您的字段类型)并查看某些内容是如何标记化的以及它是如何匹配的。您可以在那里进行实验。

【讨论】:

  • 我创建了一个新架构并且它工​​作正常,我认为我的旧 solr 架构中有些东西搞砸了。
猜你喜欢
  • 2015-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 2018-06-02
  • 1970-01-01
  • 2012-08-17
相关资源
最近更新 更多