【问题标题】:Elastic Search wildcard query not working with case insensitive ( for lower case)弹性搜索通配符查询不区分大小写(小写)
【发布时间】:2018-06-12 18:18:54
【问题描述】:

我正在尝试使用通配符查询从 elasticsearch 中获取记录。

请查找以下查询

get my_index12/_search
{ 
  "query": { 
  "wildcard": { 
  "code.keyword": { 
          "value": "*ARG*" 
        } 
    } 
  } 
}

对于上述查询,它可以正常工作并给出预期结果。但它不适用于小写值。

get my_index12/_search
{ 
  "query": { 
  "wildcard": { 
  "code.keyword": { 
          "value": "*Arg*" 
        } 
    } 
  } 
}

【问题讨论】:

    标签: java elasticsearch kibana elastic-stack


    【解决方案1】:

    尝试关注:

    映射:

    PUT my_index12
    {
    "settings": {
    "analysis": {
      "analyzer": {
        "custom_analyzer": {
          "type": "custom",
          "tokenizer": "whitespace",
          "char_filter": [
            "html_strip"
          ],
          "filter": [
            "lowercase",
            "asciifolding"
          ]
        }
       }
      }
    },
    "mappings": {
    "doc": {
      "properties": {
        "code": {
          "type": "text",
           "analyzer": "custom_analyzer"
          }
        }
      }
     }
    }
    

    然后运行Query String查询

    GET my_index12/_search
    {
    "query": {
    "query_string": {
      "default_field": "code",
      "query": "AB\\-7000*"
        }
      }
    }
    

    它也适用于ab-7000*

    让我知道它是否适合你。

    【讨论】:

    • 它没有按预期工作GET my_index12/_search { "query": { "query_string": { "default_field": "code", "query": "-7000*" } } } 我正在为搜索查询{ AB-7000-4200-Wk-21, AB-7000-5000-Wk-21, sG66tsdF } 获得此结果
    • 已更新我的答案。不知何故,hyphen 一开始的行为很奇怪。使用 Validate api 来验证这个GET my_index12/_validate/query?explain {"query":{"query_string":{"fields":["code"],"query":"-7000*"}}}
    • 我收到此请求的此错误request [/my_index12/_validate/query] contains unrecognized parameter: [explain {] -> did you mean [explain]?
    • 我可以运行这个查询。我有 6.2.4 作为 ES 版本。但无论如何,查询应该有效。它是否满足您的所有用例?
    • 非常感谢.. :)
    【解决方案2】:

    你必须规范你的关键字字段:

    ElasticSearch normalizer

    类似的东西(来自文档):

    PUT index
     {
      "settings": {
        "analysis": {
        "normalizer": {
           "my_normalizer": {
           "type": "custom",
           "char_filter": [],
           "filter": ["lowercase", "asciifolding"]
         }
       }
     }
    },
    "mappings": {
      "_doc": {
        "properties": {
          "foo": {
            "type": "keyword",
            "normalizer": "my_normalizer"
          }
        }
       }
      }
    }
    

    更新 一些附加信息:

    仅应用在字符级别操作的分析链部分。因此,例如,如果分析器同时执行小写和词干提取,则只会应用小写:对缺少某些字母的单词执行词干提取是错误的。

    通过将 analyze_wildcard 设置为 true,将分析以 * 结尾的查询,并使用不同的标记构建布尔查询,确保前 N-1 个标记完全匹配,并确保最后一个标记的前缀匹配.

    【讨论】:

    • 我创建了这个规范器 { "my_index12": { "mappings": { "doc": { "properties": { "code": { "type": "keyword", "normalizer": "my_normalizer" } } } } } } 并查询 get my_index12/_search { "query": { "wildcard": { "code.keyword": { "value": "*AB-7000-5000-Wk-21*" } } } } 并没有得到结果。
    猜你喜欢
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多