IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Elasticsearch常用搜索和分词器 -> 正文阅读

[大数据]Elasticsearch常用搜索和分词器

Elasticsearch

一. 倒排索引和正排索引

正向索引在数据库领域用的比较多,它是将全文进行分词,用户查询的时候就到所有的分词中去匹配,如果有匹配到分词,最终该文档就出现结果集中。

倒排索引在搜索引擎领域用的比较多,它也会先进行分词,接着将分词与文档进行映射,分词就构成了一个词典,当用户查询的时候,首先到词典中查找对应的分词,然后将对应的文档获取到。
在这里插入图片描述

二. ELK

Elasticsearch是真个elastic核心产品, 我们搜索都是该软件来实现的。

Logstash是一个数据输入、过滤、输出的管道,负责将不同来源数据过滤处理之后导入到Elasticsearch.

Kibana是一个操作 Elasticsearch的可视化界面,包括一些数据的统计模型。

三. Logstash的数导入

一, 将提供的数据集中 movies.csv 拷贝到 logstash的家目录下。

二,将配置文件拷贝到 LOGSTASH_HOME/config 目录下。

三, 依据情况修改 logstash.conf 配置文件中的路径。

三,导入数据,首先进到 LOGSTASH_HOME/bin, 打开dos命令行,执行如下的命令

# 具体执行的时候,将 LOGSTASH_HOME 缓存具体的Logstash的家目录
logstash -f LOGSTASH_HOME/config/logstash.conf 

四. 名词

索引,类似于RDBMS中数据库的概念,在ES中有三层含义:1. 文档的集合;2. 倒排索引;3.XXX

type,类似于数据库中表的概念,在ES7以下的版本中,是有type来区分不同的数据集;但是ES7之后,统一都叫做 _doc

文档,类似于数据库中记录的概念,数据的格式是一个JSON.

属性,就是文档中的字段的名字。

五. 基本的查询

查看所有的索引:GET _cat/indices

查看电影数据集的内容:GET movies/_search

查看电影数据集的数量:GET movies/_count

查看指定id的文档: GET movies/_doc/1

六. 基本的增删查改

添加,自动生成id

POST user/_doc
{
	"firstname": "Jack",
	"lastname": "Ma"
}

添加,指定id

POST user/_doc/2
{
	"firstname": "Pony",
	"lastname": "Ma"
}

删除

DELETE uesr/_doc/2

修改

POST user/_update/2
{
	"doc": {
		age:34
	}
}

批量添加

POST users/_bulk
{"index": {}}
{"firstname": "Rod", "lastname": "Jhonson"}
{"index": {"_id": 2}}
{"firstname": "Douge", "lastname": "Lee"}

七. Request Body查询

Request Body的查询需要的记住的就四个:

  1. match
  2. multi_match
  3. range
  4. bool
  5. match_phrase (用的比较少)

查询电影中名字包含2012的所有电影

GET movies/_search
{
	"query": {
		"match": {
			"title": "2012"
		}
	}
}

查询电影的在1992年到1993年上映的所有的电影

GET movies/_search
{
	"query": {
		"range": {
			"year": {
				"gte": 1992,
				"lte": 1993
			}
		}
	}
}

查询电影中包含有2012的所有的电影

GET movies/_search
{
	"query": {
		"multi_match": {
			"fields": ["title", "year"],
			"query": 2012
		}
	}
}

查询电影的名字中包含有 beautiful 或者 mind 的电影

GET movies/_search
{
	"query": {
		"match": {
			"title": "beautiful mind"
		}
	}
}

查询电影的名字中包含有beautiful和mind所有的电影

GET movies/_search
{
	"query": {
		"match": {
			"title": {
				"query": "beautiful mind",
				"operator": "and"  // or
			}
		}
	}
}

查询电影的名字中包含有 “beautiful mind” 短语的电影

GET movies/_search
{
	"query": {
		"match_phrase": {
			"title": "beautiful mind"
		}
	}
}

查询电影的名字中包含有 mind 或者 beautiful 的所有的电影,按照上映的年份进行倒序排序

GET movies/_search
{
	"query": {
		"match": {
			"title": "beautiful mind"
		}
	},
	"sort": [
		{
			"year": {
				"order": "desc"
			}
		}
	]
}

查询所有的战争片,然后分页

GET movies/_search
{
	"query": {
		"match": {
			"genre": "war"
		}
	},
	"from": 0,
	"size": 10
}

查询所有的战争片,并且是在2012年上映的,然后分页

GET movies/_search
{
	"query": {
		"bool": {
			"must": [
				{
					"match": {
						"genre": "war"
					}
				},
				{
					mathc: {
						"year": 2012
					}
				}
			]
		}
	},
	"from": 0,
	"size": 10
}

八. 分词器

ES内置了很多的分词,例如: stop、standard, simple, whitespace… 但是他们只针对英文处理。

ES的分词处理是 analysis, 它是通过 analyzer 来实现,analyzer 对于分词的处理分为三个步骤:

  1. character filter 过滤html标签
  2. tokenizer 切词,将一句话或者一个词切成一个个小的子或者词
  3. token filter, 将token处理之后的结果进一步处理,例如,去停用词、转大小写、转拼音。

8.1 IK和pinyin分词的安装

IK是中文分词社区中用的最多的一个分词器。

IK分词器的安装:在 ES_HOME/plugins 目录下创名为 ik 的目录,然后将 zip 文件拷贝到目录下,然后即可。

IK分词器的安装:在 ES_HOME/plugins 目录下创名为 pinyin 的目录,然后将 zip 文件拷贝到目录下,然后即可。

8.1.1 配置词库

因为IK分词器团队不可能将很多我们业务词汇加入到官方词库中,所以会导致有些词被切割了,所以我们需要配置自己的词库。

第一步,在IK分词的解压目录的 config 目录下创建一个名为 custome 的文件夹

第二步,在文件夹下创建名为 my.dic, 将自己的业务词库加进去(一个词一行),保存格式为 UTF-8

第三步,配置自定义的词典,打开 config 目录下的 IKAnalyzer.cfg.xml ,将自定义的词典配置进去,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
	<comment>IK Analyzer 扩展配置</comment>
	<!--用户可以在这里配置自己的扩展字典 -->
    <entry key="ext_dict">customer/my.dic</entry>
	 <!--用户可以在这里配置自己的扩展停止词字典-->
	<entry key="ext_stopwords"></entry>
	<!--用户可以在这里配置远程扩展字典 -->
	<!-- <entry key="remote_ext_dict">words_location</entry> -->
	<!--用户可以在这里配置远程扩展停止词字典-->
	<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

九. 案例

实现类似于电商和百度的搜索功能。

9.1 配置自定义分词器

PUT stars
{
  "settings": {
    "analysis": {
      "analyzer": {
        // 表示我们自定义的analyzer, 名字叫做 my_star_analyzer
        "my_star_analyzer": {
           // char_filter: "html_strip", 去除文本中html标签, html_strip是ES内置的一个 character filter
          "char_filter": "html_strip",
          // keyword 也是 ES内置的一个 tokenizer, 表示对我们的原文不动
          "tokenizer": "keyword",
          // filter就是 token filter, 需要自定义了
          "filter": "star_name_filter"
        }
      },
      // 自定义filter
      "filter": {
        // 自定义的filter的名字
        "star_name_filter": {
          "type":"pinyin",
          "keep_separate_first_letter" : false,
          "keep_full_pinyin" : false,
          "keep_original" : true,
          "lowercase" : true,
          "keep_joined_full_pinyin": true,
          "remove_duplicated_term" : true
        }
      }
    }
  }
}

9.2 测试

针对如上的自定义分词器进行测试, 测试是否通过(满足我们的业务需求)

GET stars/_analyze
{
  "analyzer": "my_star_analyzer",
  "text": ["刘德华"]
}

9.3 插入样本数据

插入样本数据的目的就是为了获取mapping

POST stars/_doc
{
  "name": "刘德华"
}

9.4 获取mapping信息

获取mapping信息

GET starts

拷贝其mapping信息

9.5 定义mapping

9.4 节获取到的mapping, 结合9.1 节自定义的分词器,创建业务所需的mapping

PUT stars/_mapping
{
  "properties" : {
    "name" : {
      // 前缀的类型是 completion
      "type" : "completion",
      // 数据写到ES的时候,所采用的分词,是我们在上面自定义的
      "analyzer": "my_star_analyzer",
      // 表示用户在搜索的时候,不分词,就用户传入什么内容,就原封不动的丢到ES进行匹配
      "search_analyzer": "keyword"
    }
  }
}

9.6 写入数据

POST stars/_bulk
{"index": {"_id": 1}}
{"name": "李小璐"}
{"index": {"_id": 2}}
{"name": "柳岩"}
{"index": {"_id": 3}}
{"name": "刘德华"}
{"index": {"_id": 4}}
{"name": "蔡徐坤"}

9.7 测试

样本一:

// 建议搜索
GET stars/_search
{
  "_source": "", 
   "suggest": {
    // 自己取的建议的名字
    "start_name_prefix_suggest": {
      "prefix": "ldh,
      "completion": {
        "field": "name"
      }
    }
  }
}

样本二:

// 建议搜索
GET stars/_search
{
  "_source": "", 
   "suggest": {
    // 自己取的建议的名字
    "start_name_prefix_suggest": {
      "prefix": "lixiao,
      "completion": {
        "field": "name"
      }
    }
  }
}

十一. 面试问题

数据写入到ES的过程?

  1. character_filter
  2. tokenizer
  3. token filter

工作中你用在哪里?怎嘛用的?

  1. 搜索提示,类似京东、百度的搜索提示。
  2. 内容检索。

搜索提示怎么做?

  1. 先根据IK分词、和 pinyin 分词自定义自己的分词器,配置 character_filter , tokenizer,token filter这些信息。
  2. 设置mapping信息,将我们用于提示的属性的类型设置 completion, 以及分词器设置成我们自定义的分词器。
  3. 导入数据(Logstash), 程序导入。
  4. 代码实现,前端展示。

内容检索怎么做?

  1. 定义mapping信息,将其分词器设置成 ik_smart 分词器。
  2. 写入数据。
  3. 根据用户搜索提示的信息,选中对应的词条,然后使用 matchmulti_match 进行匹配。
  4. 检索数据使用高亮展示。

你的数据是怎么同步?增量数据?

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-07-29 11:43:03  更:2021-07-29 11:43:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/7 5:00:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码