Elasticsearch从范围查询的解析值创建数值字段时出现问题

pvabu6sv  于 2023-06-21  发布在  ElasticSearch
关注(0)|答案(1)|浏览(135)

我有一个输入的电话号码,其中可能包括-,+或字母。我想为Range查询提供该值的数字版本。因此,我能够将+233-333-3444解析为2333333444,当我使用“phone-num.parsedValue = 23333334444”进行“匹配查询”时,我收到了结果。

"phone-num": {

"text",

"fields": {

"parsedValue": {

"analyzer": "phone-analyzer",

"type":"text"

}}}

当我试图做一个范围查询时:

"query":{

"range":{

"phone-num.parsedValue":{

"from":1,

"to": 2333333444,

"include_lower":true,

"include_upper":true }}}

我得到0个结果。我很确定这是因为值是字符串。问题是我不知道如何质疑它。我尝试了“copy_to”和“fields within fields”,但都不起作用。有没有办法:
1.根据我的“parsedValue”结果保存另一个值,并保存足够长的时间,以便我可以搜索它
1.如果我不能在Map部分完成,那么作为查询的一部分进行解析呢?
因此,要回顾-我想执行范围查询传入的电话号码与非数字值。我确实用自定义分析器过滤了它以删除非数字,但由于结果值仍然是字符串,因此无法对其进行搜索。

kqhtkvqz

kqhtkvqz1#

相反,我会将解析后的值字段作为关键字字段保留,并对其使用范围查询。
下面是您可以使用的Map示例:

PUT phone-numbers-index 
{
  "settings": {
    "analysis": {
      "normalizer": {
        "digits-only": {
          "type": "custom",
          "char_filter": "digits-only"
        }
      },
      "analyzer": {
        
      },
      "char_filter" : {
        "digits-only":{
            "type":"pattern_replace",
            "pattern":"[^0-9]",
            "replacement":""
        }
      },
      "filter": {
        
      }
    }
  }, 
  "mappings": {
    "properties": {
      "phone-num": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword"
          },
          "digits-only": {
            "type": "keyword",
            "normalizer": "digits-only"
          }
        }
      }
    }
  }
}

这将在您的phone-num字段上创建一个名为“digits-only”的字段。然后,您可以在仅数字字段上使用范围查询来查询两个值之间的电话号码:

GET phone-numbers-index/_search
{
  "query": {
    "range": {
      "phone-num.digits-only": {
        "gt": "1",
        "lte": "2333333444"
      }
    }
  }
}

此查询将返回电话号码大于1且小于或等于(233)333-3444的每个文档

相关问题