elasticsearch 如何按数字查询,不考虑特殊字符

llmtgqce  于 2023-01-25  发布在  ElasticSearch
关注(0)|答案(1)|浏览(189)

当前我的opensearch数据库中有一个值为1301-003.023的文档。如果运行以下查询,将返回该文档:

GET test/example
{
  "query": {
    "match": {
      "my_number": "1301-003.023"
    }
  }
}

主要问题是如果用户运行该查询:

GET test/example
{
  "query": {
    "match": {
      "my_number": "1301003.023"
    }
  }
}

在上面的查询中,符号-丢失了,它将不会返回任何结果。我需要创建一个搜索,它可以处理这个问题,但不会返回具有不完全相同编号的文档。因此,如果我搜索1301003023,我希望找到具有1301-003.023的文档,但我不搜索具有1301-003.032的文档(请注意,最后两个编号交换了)

zpqajqem

zpqajqem1#

我创建了一个新的分析器,使用字符过滤器将符号"."和"-"Map为空,因此,数字"1301 - 003.023"变成了标记"1301003023"。
完整示例:

PUT /test
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "standard",
          "char_filter": [
            "my_filter"
          ]
        }
      },
      "char_filter": {
        "my_filter": {
          "type": "mapping",
          "mappings": [
            ". => ",
            "- => "
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "my_number": {
        "type": "text",
        "analyzer": "my_analyzer"
      }
    }
  }
}

文件

POST test/_bulk
{"index":{}}
{"my_number": "1301-003.023"}

质询

GET test/_search
{
  "query": {
    "match": {
      "my_number": {
        "query": "1301003023"
      }
    }
  }
}

结果

"hits": [
  {
    "_index": "test",
    "_id": "MC7v0IUBKJKciEqCrBP-",
    "_score": 0.2876821,
    "_source": {
      "my_number": "1301-003.023"
    }
  }

相关问题