不区分大小写的搜索,其中包含“ /”和“-”

时间:2019-02-04 19:41:17

标签: elasticsearch

这个问题是我的两个问题的组合:

第一个问题的答案允许我使用“ /”和“-”搜索数据。但是搜索是区分大小写的。

在第二个问题中,我进行了不区分大小写的搜索,但是搜索“ /”和“-”已损坏。

我现在所拥有的:

{  
    "settings": {
    "analysis": {
      "analyzer": {
        "folding": {
          "tokenizer": "whitespace",
          "filter":  [ "lowercase", "asciifolding" ]
        }
      },
      "normalizer": {
        "lowerasciinormalizer": {
          "type": "custom",
          "filter":  [ "lowercase", "asciifolding" ]
        }
      }
    }
  },
  "mappings": {
             "entity": {
                 "properties": {

                     "Description": {
              "type": "text",
                "analyzer": "whitespace",
                          "fields": {
                                "keyword": {
                                    "type": "keyword",
                                  "normalizer": "lowerasciinormalizer"      
                                }
                            }
              },

                    "Name": {
              "type": "text",
                "analyzer": "whitespace",
                    "fields": {
                                "keyword": {
                                    "type": "keyword",
                                  "normalizer": "lowerasciinormalizer"      
                                }
                            }
            }
            }
     }
    }
}

该索引允许我执行不区分大小写的搜索,但是找不到这样的文档:

PUT
{
  "name": "Harry Potter",
  "author": "Some 28/56 another"
}

POST
{
    "query": {
        "query_string": { "default_field": "author", "query": "*28\\/56*" }
    }
}

是否可以使用不区分大小写的搜索,使其与“ /”和“-”一起使用?

1 个答案:

答案 0 :(得分:1)

您已经定义了一个名为folding的分析器,该分析器可以满足您不区分大小写的搜索的要求,其中不使用/-来标记输入字符串。您应该在映射中添加author,如下所示:

"author": {
  "type": "text",
  "analyzer": "folding"
}

然后使用以下查询进行匹配:

{
  "query": {
    "query_string": {
      "default_field": "author",
      "query": "28\\/859"
    }
  }
}

如果只希望使用小写的空白标记器,则定义另一个分析器,如下所示:

"lowercaseWs": {
  "filter": [
    "lowercase"
  ],
  "tokenizer": "whitespace"
}

然后将以上内容与author字段一起使用,如下所示:

"author": {
  "type": "text",
  "analyzer": "lowercaseWs"
}