elasticsearch,search,Database,elasticsearch,Search" /> elasticsearch,search,Database,elasticsearch,Search" />

Database elasticsearch如何使用精确搜索并忽略关键字中的特殊字符?

Database elasticsearch如何使用精确搜索并忽略关键字中的特殊字符?,database,elasticsearch,search,Database,elasticsearch,Search,我的elasticsearch索引中有一些id值(数字和文本组合),在我的程序中,用户可能会在搜索关键字中输入一些特殊字符。 我想知道是否有任何方法可以让elasticsearch使用精确搜索,也可以删除搜索关键字中的一些特殊字符 我已经使用自定义分析器将搜索关键字拆分为一些特殊字符。然后用query->match搜索数据,结果还是没有 资料 { “_索引”:“测试数据”, “\u类型”:“\u单据”, “_id”:“11112222”, “_来源”:{ “testid”:“1MK444750”

我的elasticsearch索引中有一些id值(数字和文本组合),在我的程序中,用户可能会在搜索关键字中输入一些特殊字符。 我想知道是否有任何方法可以让elasticsearch使用精确搜索,也可以删除搜索关键字中的一些特殊字符

我已经使用自定义分析器将搜索关键字拆分为一些特殊字符。然后用query->match搜索数据,结果还是没有

  • 资料
  • {
    “_索引”:“测试数据”,
    “\u类型”:“\u单据”,
    “_id”:“11112222”,
    “_来源”:{
    “testid”:“1MK444750”
    }
    }
    
  • 自定义分析器
  • “分析”:{
    “分析器”:{
    “测试分析仪”:{
    “模式”:“([^\w\d]+||”,
    “类型”:“模式”
    }
    }
    }
    
  • 映射
  • {
    “第条”:{
    “映射”:{
    “_doc”:{
    “财产”:{
    “睾丸”:{
    “类型”:“文本”,
    “分析仪”:“测试分析仪”
    }
    }
    }
    }
    }
    }
    
    这是我的elasticsearch查询

    GET/testdata/\u搜索
    {
    “查询”:{
    “匹配”:{
    //“测试”:“1MK_444-750”//无结果
    “testid”:“1MK444750”
    }
    }
    }
    
    analyzer成功地分离了我的关键字,但我无法匹配结果中的任何内容

    POST/testdata/\u分析
    {
    “分析仪”:“测试分析仪”,
    “文本”:“1MK_444-750”
    }
    {
    “代币”:[
    {
    “令牌”:“1mk”,
    “起始偏移量”:0,
    “端部偏移”:3,
    “类型”:“单词”,
    “位置”:0
    },
    {
    “令牌”:“444”,
    “起始偏移量”:4,
    “端部偏移”:7,
    “类型”:“单词”,
    “职位”:1
    },
    {
    “令牌”:“750”,
    “起始偏移量”:8,
    “端部偏移”:11,
    “类型”:“单词”,
    “职位”:2
    }
    ]
    }
    

    请帮忙,提前谢谢

    首先,您可能应该将
    testid
    字段建模为
    关键字
    ,而不是
    文本
    ,它是更合适的数据类型

    您希望加入一个功能,在搜索时可以有效地忽略某些字符(
    -
    )。您可以通过为字段提供一个规范化器来实现这一点,该规范化器告诉Elasticsearch如何在索引或搜索之前预处理该字段的数据。具体来说,您可以在规范化程序中声明一个,用空字符串替换这些字符

    以下是所有这些更改如何适应您的映射:

    PUT /testdata
    {
      "settings": {
        "analysis": {
          "char_filter": {
            "mycharfilter": {
              "type": "mapping",
              "mappings": [
                "_ => ",
                "- => "
              ]
            }        
          },
          "normalizer": {
            "mynormalizer": {
              "type": "custom",
              "char_filter": [
                "mycharfilter"
              ]
            }
          }
        }
      },
      "mappings": {
        "_doc": {
          "properties": {
            "testid" : {
              "type" : "keyword",
              "normalizer" : "mynormalizer"
            }
          }
        }
      }
    }
    
    然后,以下搜索将产生相同的结果:

    GET /testdata/_search
    {
      "query": {
        "match": {
          "testid": "1MK444750"
        }
      }
    }
    
    GET /testdata/_search
    {
      "query": {
        "match": {
          "testid": "1MK_444-750"
        }
      }
    }