学习总结录 学习总结录
首页
归档
分类
标签
  • Java基础
  • Java集合
  • MySQL
  • Redis
  • JVM
  • 多线程
  • 计算机网络
  • 操作系统
  • Spring
  • Kafka
  • Elasticsearch
  • Python
  • 面试专题
  • 案例实践
  • 工具使用
  • 项目搭建
  • 服务治理
  • ORM框架
  • 分布式组件
  • MiniSpring
  • 设计模式
  • 算法思想
  • 编码规范
友链
关于
GitHub (opens new window)
首页
归档
分类
标签
  • Java基础
  • Java集合
  • MySQL
  • Redis
  • JVM
  • 多线程
  • 计算机网络
  • 操作系统
  • Spring
  • Kafka
  • Elasticsearch
  • Python
  • 面试专题
  • 案例实践
  • 工具使用
  • 项目搭建
  • 服务治理
  • ORM框架
  • 分布式组件
  • MiniSpring
  • 设计模式
  • 算法思想
  • 编码规范
友链
关于
GitHub (opens new window)
  • Java基础

  • Java集合

  • MySQL

  • Redis

  • JVM

  • 多线程

  • 计算机网络

  • Spring

  • Kafka

  • Elasticsearch

    • ElasticSearch基本概念
    • 文档基本操作
    • 倒排索引
    • 分词器
    • Mapping和常见字段类型
    • Index Template&Dynamic Template
    • Elasticsearch聚合分析简介
    • 基于词项和基于全文的搜索
      • 一、基于Term的查询
        • 1、概念和特点
        • 2、案例
      • 二、基于全文的查询
        • 1、概念和特点
        • 2、案例
      • 参考
    • 结构化搜索
    • 搜索的相关性算分
    • 单字符串多字段查询
    • SearchTemplate 和 Index Alias 查询
    • Function Score Query 优化算分
    • Term&Phrase Suggester
    • 自动补全于基于上下文的提示
  • Python

  • 面试专题

  • 知识库
  • Elasticsearch
旭日
2023-05-26
目录

基于词项和基于全文的搜索

# 一、基于Term的查询

# 1、概念和特点

概念

Term是表达语意的最小单位,搜索和利用统计语言模型进行自然语言处理都需要处理Term。

特点

  • 基于Term的查询:Term Query / Range Query / Exists Query / Prefix Query。
  • 在ES中,Term查询,对输入不做分词,会将输入作为一个整体,在倒排索引中查找精确的词项,并对包含该词项的文档进行算分。
  • 如果想要避免算分,并利用缓存,可以通过constant_score将查询转换成一个Filtering。

# 2、案例

数据准备

POST /products/_bulk
{ "index": { "_id": 1 }}
{ "productID" : "XHDK-A-1293-#fJ3","desc":"iPhone" }
{ "index": { "_id": 2 }}
{ "productID" : "KDKE-B-9947-#kL5","desc":"iPad" }
{ "index": { "_id": 3 }}
{ "productID" : "JODL-X-1937-#pV7","desc":"MBP" }

数据查询

POST /products/_search
{
  "query": {
    "term": {
      "desc": {
        "value": "iPhone"
      }
    }
  }
}

这样一条查询语句查询结果是空,为什么呢?

这是因为Term查询,默认是会在倒排索引中查找精确的词项,但是ES默认的分词器会进行分词和小写处理,也就是iPhone这个单词已经被分词和小写处理了,在倒排索引中它是为iphone,所以无法匹配上。

POST /products/_search
{
  "query": {
    "term": {
      "desc": {
        "value": "iphone"
      }
    }
  }
}

将单词改写成小写就可以精确匹配上了,如果不想更改单词的分词和大小写,可以使用如下方式进行查询:

POST /products/_search
{
  "query": {
    "term": {
      "desc.keyword": {
        "value": "iPhone"
      }
    }
  }
}

如果我们想要避免算分,有效利用我们的缓冲:

POST /products/_search
{
  "explain": true,
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "productID.keyword": "XHDK-A-1293-#fJ3"
        }
      }

    }
  }
}

# 二、基于全文的查询

# 1、概念和特点

概念

基于全文本的查询主要有:

  • Match Query
  • Match Phrase Query
  • Query String Query

特点

  • 索引和搜索都会进行分词,查询字符串先传递到一个合适的分词器,然后生成一个供查询的列表。
  • 查询时候,会对输入的查询进行分词,然后每个词项单独进行查询,然后将结果进行合并。比如查询 A B,会查询到包括A或者B的所有结果。

# 2、案例

数据准备

#设置 position_increment_gap
DELETE groups
PUT groups
{
  "mappings": {
    "properties": {
      "names":{
        "type": "text",
        "position_increment_gap": 0
      }
    }
  }
}

GET groups/_mapping

POST groups/_doc
{
  "names": [ "John Water", "Water Smith"]
}

数据查询

POST groups/_search
{
  "query": {
    "match_phrase": {
      "names": "Water"
    }
  }
}

POST groups/_search
{
  "query": {
    "match": {
      "names": {
        "query": "Water Smith",
        "operator": "and"
      }
    }
  }
}

# 参考

Elasticsearch 核心技术与实战 (opens new window)

#Elasticsearch
上次更新: 2024/06/29, 15:13:44
Elasticsearch聚合分析简介
结构化搜索

← Elasticsearch聚合分析简介 结构化搜索→

最近更新
01
基础概念
10-31
02
Pytorch
10-30
03
Numpy
10-30
更多文章>
Theme by Vdoing | Copyright © 2021-2024 旭日 | 蜀ICP备2021000788号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式