tnblog
首页
视频
资源
登录

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

6622人阅读 2021/1/3 17:22 总访问:3656450 评论:0 收藏:1 手机
分类: 云产品

elasticsearch

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

基于 Term 的查询

Term 的重要性

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

特点

—— Term Level Query:Term Query / Range Query / Exists Query / Prefix Query / Wildcard Query

—— 在 ES 中,Term 查询,对输入不做分词。会将输入作为一个整体,在倒排索引中查找准确的词项,并且使用相关度算分公司为每个包含该词项的文档进行相关度算分 — 例如 “Apple Store”

—— 可以通过 Constant Score 将查询转换成一个 Filtering,避免算分,并利用缓存,提高性能

关于 Term 查询的例子

准备一些案例代码数据
  1. POST /products/_bulk
  2. { "index": { "_id": 1 }}
  3. { "productID" : "XHDK-A-1293-#fJ3","desc":"iPhone" }
  4. { "index": { "_id": 2 }}
  5. { "productID" : "KDKE-B-9947-#kL5","desc":"iPad" }
  6. { "index": { "_id": 3 }}
  7. { "productID" : "JODL-X-1937-#pV7","desc":"MBP" }

通过Term的方式进行查询。
  1. POST /products/_search
  2. {
  3. "query": {
  4. "term": {
  5. "desc": {
  6. //"value": "iPhone"
  7. "value":"iphone"
  8. }
  9. }
  10. }
  11. }

注意:这是因为我们在添加数据进行索引的时候,Elasticsearch 自动的为数据添加默认的analyzer(变为小写),而并不是Term进行了分词处理。

多字段 Mapping 和 Term 查询

通过 GET /products/_mapping 的查询出 Elasticsearch 会自动为字段赋值类型,这里为keyword

这里我们也可以通过指定 keyword 来进行查询
  1. POST /products/_search
  2. {
  3. "query": {
  4. "term": {
  5. "desc.keyword": {
  6. "value": "iPhone"
  7. }
  8. }
  9. }
  10. }

但是在这里我们发现它仍然有一个 _score 的算分统计,它或多或少会影响系统性能。我们可以通过 Constant Score 告诉系统不进行算分。

复合查询 — Constant Score 转为 Filter

—— 将 Query 转成 Filter,忽略 TF-IDE 计算,避免相关性算分的开销。
—— FIlter 可以有效利用缓存。
  1. POST /products/_search
  2. {
  3. "explain": true,
  4. "query": {
  5. "constant_score": {
  6. "filter": {
  7. "term": {
  8. "desc.keyword": {
  9. "value": "iPhone"
  10. }
  11. }
  12. }
  13. }
  14. }
  15. }

基于全文本的查询

基于全文本的查找

Match Query / Match Phrase Query / Query String Query

特点

—— 索引和搜索时都会进行分词,查询字符串先传递到一个合适的分词器,然后生成一个供查询的词项列表

—— 查询时候,先会对输入的查询进行分词,然后每个词项逐个进行底层的查询,最终将结果进行合并。并为每一个文档生成一个算分。例如:查“Matrix reloaded”,会查到包括Matrix 或者 reload 的所有结果。

有关更多,大家可以参考以前的文章:https://www.tnblog.net/hb/article/details/5071

总结

首先Term查询是不会进行分词的,但在添加数据的索引的时候是会进行分词处理的,而全文本也会进行分词处理。
当然在用Term查询时,我们可以用字段 Mapping 去控制字段的分词(将字段类型写成Keyword),在用全文文本查询时也可以用适当的Precision & Recall去进行精确的查找。最后Constant Score可以将Term查询转换为Filter,取消算分缓解,以达到提升性能的目的。


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

Elasticsearch 安装与部署

Elasticsearch 安装与部署[TOC] 环境准备 Java 8.0以上的环境本机环境为Mac,Java 14.0.2 获取 Elasticsearch 安装包 ...

Docker运行 Elasticsearch Kibana和Cerebro

Docker运行 Elasticsearch Kibana和Cerebro[TOC] Demo 运行 Docker-compose,本地构建更高效的开发环境,更直观地了解 El...

Elasticsearch 基本概念:索引、文档和REST API

Elasticsearch 基本概念:索引、文档和REST API[TOC] 前言 为了了解 Elasticsearch 如何构成,我们首先需要理解索引(I...

Elasticsearch 基本概念:节点、集群、分片及副本

Elasticsearch 基本概念:节点、集群、分片及副本[TOC] 分布式系统的可用性与扩展性 高可用性 服务可用性 - 允许有节...

Elasticsearch 文档的基本CRUD与批量操作

Elasticsearch 文档的基本CRUD与批量操作[TOC] 文档的 CRUD Index PUT my_index/_doc/1 {“user”:...

Elasticsearch 倒排索引(运用Analyzer进行分词)

Elasticsearch 倒排索引[TOC] 正排与倒排索引 我们以一本书为例子,一本书的目录为正排索引,它将排列整本书的主要大纲...

Elasticsearch Search API概览

Elasticsearch Search API概览[TOC] Search API 通过搜索获取的数据方式有两种。 URL Search 在URL中使用查询参数...

Elasticsearch URL Search详解

Elasticsearch URL Search详解[TOC] 通过 URL Query 实现搜索举例: Get /movies/_search?q=2020&df=title&sort...

Elasticsearch Request Body与Query DSL简介

Elasticsearch Request Body与Query DSL简介[TOC] Request Body Search 将查询语句通过 HTTP Resquest Body 发送给 Ela...

Elasticsearch 显式Mapping设置与常见参数介绍

Elasticsearch 显式Mapping设置与常见参数介绍[TOC] 如何显示的定义一个MappingPut movies { "mappings" ...

Elasticsearch 多字段特性及Mapping中配置自定义Analyzer

Elasticsearch 多字段特性及Mapping中配置自定义Analyzer[TOC] 多字段类型多字段特性 厂家名字可以实现精确匹配,增加一...

Elasticsearch Index Template 和 Dynamic Template

Elasticsearch Index Template和Dynamic Template[TOC] 什么是 Index Template 可以通过一定的规则去设定 Mappings 和 Se...

Elasticsearch 聚合分析简介

Elasticsearch 聚合分析简介[TOC] 什么是聚合(Aggregation) 聚合:对有关的数据进行内容挑选、分析、归类(筛选),最...

.NET Core使用Elasticsearch 一:windows安装Elasticsearch与kibana

一:安装java环境ElasticSearch是基于Java的所以先要安装Java,dkj,当然下载的ElasticSearch也带得也jkd也可以使用那个。下...

.NET Core使用Elasticsearch 二:CORE操作ES基础环境与简单查询

Elasticsearch使用版本7.12.0安装Elasticsearch与kibana可以参考:https://www.tnblog.net/aojiancc2/article/details/5875...
这一世以无限游戏为使命!
排名
2
文章
657
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术