首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何查询一个精确的文本字段并在ElasticSearch索引中的另一个数字字段上过滤术语?

如何查询一个精确的文本字段并在ElasticSearch索引中的另一个数字字段上过滤术语?
EN

Stack Overflow用户
提问于 2021-03-16 07:08:59
回答 2查看 466关注 0票数 0

我正在尝试查询在特定文本字段Field_Name_1上具有匹配值的所有文档的索引,并对这些结果进行过滤,以仅显示其Field_Name_2字段在所提供的列表中具有任意数值的文档。

我面临的问题是,查询将返回与Field_Name_1中的值有点匹配的文档,但我只需要返回与Field_Name_1的值完全匹配的文档。通过研究,我认为我应该将Field_Name_1设置为关键字字段,而不是文本字段,因为我永远不需要通过提供Field_Name_1的完整值来运行此查询。

我认为我需要创建一个新的索引,并将Field_Name_1设置为关键字,然后重新建立索引,这是正确的吗?我以前没有重建过索引,所以我担心如果我做得不好会丢失数据。有没有办法在Field_Name_1为文本字段的情况下执行此查询?

这是我尝试过的两个查询,但它们都返回相同的结果。唯一的区别是第一个查询返回的"max_score“为9.54,而第二个查询返回的"max_score”为0。

代码语言:javascript
运行
复制
GET Index_Name/_search
{
  "query": {
    "bool": {
      "must": {
        "match": {
          "Field_Name_1": "12345-1234-1234-1234-d123f123g123"
        }
      },
      "filter": {
        "terms": {
          "Field_Name_2": [
            1,
            2,
            3,
            4,
            5
          ]
        }
      }
    }
  },
  "track_total_hits": true
}


GET Index_Name/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "match": {
             "Field_Name_1": "12345-1234-1234-1234-d123f123g123"
          }
        },
        {
          "terms": {
            "Field_Name_2": [
              1,
              2,
              3,
              4,
              5
            ]
          }
        }
      ]
    }
  },
  "track_total_hits": true
}
EN

回答 2

Stack Overflow用户

发布于 2021-03-16 10:15:41

keyword 字段应为类型。

这是因为如果未指定分析器,则Elasticsearch使用standard analyzer。您可以使用分析API检查生成的令牌,如下所示:

代码语言:javascript
运行
复制
GET /_analyze
{
  "analyzer": "standard",
  "text": "12345-1234-1234-1234-d123f123g123"
}

生成的令牌将是

代码语言:javascript
运行
复制
{
  "tokens": [
    {
      "token": "12345",
      "start_offset": 0,
      "end_offset": 5,
      "type": "<NUM>",
      "position": 0
    },
    {
      "token": "1234",
      "start_offset": 6,
      "end_offset": 10,
      "type": "<NUM>",
      "position": 1
    },
    {
      "token": "1234",
      "start_offset": 11,
      "end_offset": 15,
      "type": "<NUM>",
      "position": 2
    },
    {
      "token": "1234",
      "start_offset": 16,
      "end_offset": 20,
      "type": "<NUM>",
      "position": 3
    },
    {
      "token": "d123f123g123",
      "start_offset": 21,
      "end_offset": 33,
      "type": "<ALPHANUM>",
      "position": 4
    }
  ]
}

要返回与Field_Name_1的值完全匹配的文档,可以将Field_Name_1字段的数据类型更改为keyword类型。

修改后的索引映射将是

代码语言:javascript
运行
复制
{
  "mappings": {
    "properties": {
      "Field_Name_1": {
        "type": "keyword"
      }
    }
  }
}

或者,如果您尚未显式定义任何映射,则还可以像这样修改搜索查询:

代码语言:javascript
运行
复制
{
  "query": {
    "bool": {
      "must": {
        "match": {
          "Field_Name_1.keyword": "12345-1234-1234-1234-d123f123g123"   // note this
        }
      },
      "filter": {
        "terms": {
          "Field_Name_2": [
            1,
            2,
            3,
            4,
            5
          ]
        }
      }
    }
  },
  "track_total_hits": true
}

这将使用keyword分析器而不是标准分析器(请注意Field_Name_1后的".keyword“字段)

票数 1
EN

Stack Overflow用户

发布于 2021-03-16 12:25:05

我认为ESCoder写的就是你问题的答案。

另外,

“为查询上下文中的查询计算的分数表示为单精度浮点数”

在过滤器上下文 中,不计算任何分数。Filter context主要用于过滤结构化数据,例如Field_Name_1字段是否设置为"12345-1234-1234-1234-d123f123g123"?

“经常使用的过滤器将被Elasticsearch自动缓存,以提高性能。”

如果需要精确匹配Field_Name_1的值,可以使用筛选器作为更好的选择。

https://www.elastic.co/guide/en/elasticsearch/reference/7.11/query-filter-context.html

代码语言:javascript
运行
复制
GET Index_Name/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "match": {
             "Field_Name_1.keyword": "12345-1234-1234-1234-d123f123g123"
          }
        },
        {
          "terms": {
            "Field_Name_2": [
              1,
              2,
              3,
              4,
              5
            ]
          }
        }
      ]
    }
  },
  "track_total_hits": true
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66646914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档