【问题标题】:ElasticSearch escape special characterElasticSearch 转义特殊字符
【发布时间】:2021-06-14 13:57:12
【问题描述】:

如何使用 query_string 查询转义 Unicode 字符?例如,我的文档包含以下数据:

{
    "title":"Sachin$tendular"
     } 

我正在通过以下方式使用 query_string 查询:

{
  "query": {
    "query_string": {
      "fields": ["title"],
      "query": "*Sachin$*"
    }
  }
}

但它没有给我任何结果,如果我从查询中删除 $ 它可以工作

那么我们如何在这里处理 $?

嗨,我的标题字段映射是

"title" : {
                    "type" : "text",
                    "fields" : {
                      "keyword" : {
                        "type" : "keyword"
                      }
                    }
                  }

我使用类似查询的方式

[{
    "query_string": {
         "query": "*character*",
           "fields": ["title.raw"],
            "default_operator": "OR"
     }
 }]

它可以工作,但是当我使用类似查询时

[{
        "query_string": {
             "query": "*Special character*",
               "fields": ["title.raw"],
                "default_operator": "OR"
         }
     }]

它不起作用,但是

[{
            "query_string": {
                 "query": "*Special character*",
                   "fields": ["title"],
                    "default_operator": "OR"
             }
         }]

它的工作原理和我的标题数据如下:

Special character test ! @ # $ % ^ & * ( ) _ + - = { } [ ] | \\ ; : \" ' < > , . / ? ~ ` ₹

那么如何使用单个查询在此处获得所有组合结果?以及何时在此处使用 title 和 title.raw

【问题讨论】:

    标签: elasticsearch elastic-stack


    【解决方案1】:

    假设title字段是text类型,那么如果text类型字段没有定义分析器,elasticsearch使用标准分析器。 Sachin$tendular 被标记为

    {
      "tokens": [
        {
          "token": "sachin",
          "start_offset": 0,
          "end_offset": 6,
          "type": "<ALPHANUM>",
          "position": 0
        },
        {
          "token": "tendular",
          "start_offset": 7,
          "end_offset": 15,
          "type": "<ALPHANUM>",
          "position": 1
        }
      ]
    } 
    

    如果您使用默认映射,您可以在title.keyword 字段上使用查询字符串。这将使用关键字分析器,而不是标准分析器。否则,将title字段的数据类型改为keyword类型

    {
      "query": {
        "query_string": {
          "fields": ["title.keyword"],
          "query": "*Sachin$*"
        }
      }
    }
    

    否则,您可以update your field mapping,对title 字段使用多字段,如文档所示。

    更新 1:

    您可以改用wildcard query 来搜索带空格的通配符表达式

    {
      "query": {
        "wildcard": {
          "title.keyword": {
            "value": "*Special character*"
          }
        }
      }
    }
    

    【讨论】:

    • 谢谢 我们如何在嵌套字段中使用它?
    • @SurajDalvi 您要询问哪些嵌套字段?
    • 用标题字段映射更新问题,请检查一下并告诉我
    • 基本上,我想在这里使用包含查询。意味着我想要那些包含给定值的标题。全值或部分值
    • @SurajDalvi 更新了答案,请仔细阅读更新部分,如果这能解决您的问题,请告诉我?
    猜你喜欢
    • 2017-03-06
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 2016-05-01
    • 2019-01-29
    • 2018-07-16
    相关资源
    最近更新 更多