ElasticSearch term和match查询机制解析和隐藏的查询问题

本文详细解析了ElasticSearch中term和match查询的区别,特别是面对中文数据时的处理。默认分析器会导致term查询无法匹配整个词组,而match查询会进行分析。解决方式包括理解分析过程并考虑使用shingle等配置,以适应不同查询需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2. 关于默认分析使用term查询的问题

  之前说过es的默认分析器会讲中文拆分成一个个的单个汉子,搜索条件“内科”会被分析为“内”和“科”,从而进行搜索。而对于搜索我们常用的match搜索类似于数据库的模糊查询,term搜索为精确查询。使用的时候会出现以下情况:

2.1 场景

默认不对索引下的字段进行mapping操作时,使用的是默认分析器,假设有如下数据内容:

内科
内一科
内二科
普通内科
肿瘤内科

我们使用match搜索来搜索“肿瘤”,得到的结果显而易见是“肿瘤内科”,搜索“肿瘤内科”,得到的不仅是“肿瘤内科”,“内一科”等另外几个包含“内”、“科”的也会列出来,但是当我们使用term搜索“肿瘤”时,我们得到的是空的结果,这也是显而易见的,因为term是精确查询,“肿瘤”和“肿瘤内科”是不同的。那么如果我们term搜索“肿瘤内科”,理论上应该出现“肿瘤内科”才符合我们的预期。但是:

{
    "query":{
        "term":{"name":"肿瘤内科"}
    }
}
<-----------    result    ----------->
{
    "took": 1,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 0,
        "max_score": null,
        "hits": []
    }
}

得到的结果依然是空的,我们更换搜索条件,输入“内科”,得到的依然是空的。但是当我们输入“肿”或者“肿瘤内科”的任意一个单字时,都可以的到“肿瘤内科”的结果,于此同时,“内”和“科”将会得到所有包含“内”和“科”

### Elasticsearch 中 `match` `term` 查询的区别 #### 1. 数据处理方式的不同 `term` 查询用于查找确切的术语,它不会对输入数据进行分析。因此,在索引阶段存储的数据是什么样,查询时就需要完全匹配该形式才能找到结果[^1]。相比之下,`match` 查询会在执行前自动分析所提供的文本内容。这种特性使得它可以针对已经过分析并存储为多个标记(tokens)的字段进行有效搜索[^4]。 #### 2. 字段类型的适用性差异 对于像 keyword 这样的未被分词器处理过的精确值字段来说,通常推荐使用 `term` 查询来实现精准检索需求;而对于 text 类型这样的会被默认标准分词器或其他指定分词策略拆分成若干子项后再存入倒排索引中的情况,则更适合采用能够理解这些分割单元之间关系并通过相应逻辑组合起来形成最终表达式的 `match` 或其他高级查询方法[^5]。 #### 3. 实际应用案例对比 假设有一个包含产品名称及其描述信息的商品数据库,并且我们希望找出所有名字正好等于 “Apple Watch Series 8”的记录: 如果直接运用未经修改的标准配置下的 `term` 操作符去尝试完成上述任务的话可能会遇到困难——除非原始字符串已经被事先设置成了不可再进一步分解的形式(即定义为了keyword),否则由于自然语言处理过程中不可避免的存在诸如大小写转换、去除停用词等一系列预处理动作的影响,“apple watch series 8” 可能早已被打散成单独几个独立的部分分别对应不同的词条位置了,此时单纯依靠简单的字面意义比较显然无法达到预期效果[^3]。 然而当我们改用支持内置解析功能的 `match` 版本来重新构建相同的请求参数列表之后却可以轻松解决这个问题,因为它内部会先按照既定规则把目标串切分为合适的片段然后再逐一对照可能存在的候选项集合直至发现符合条件的对象为止。 ```json // Example of a term query (exact match on keywords) { "query": { "term": { "product_name.keyword": "Apple Watch Series 8" } } } // Example of a match query (analyzed search against texts) { "query": { "match": { "product_description": "smartwatch with health monitoring features" } } } ``` 以上两个例子展示了如何根据不同业务场景选择合适的方式来进行高效的信息定位操作。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值