大数据计算引擎(三)——Elasticsearch入门

【云计算】揭秘搜索引擎与云计算技术 本文系统介绍了搜索引擎实现原理与云计算技术发展。简易搜索引擎的实现包括数据收集(爬虫)、索引构建、查询处理和结果呈现四个环节;而谷歌等商业搜索引擎则在此基础上加入了PageRank算法、个性化推荐等复杂技术。云计算作为新型计算模式,通过虚拟化技术将物理资源转化为弹性服务,AWS、阿里云等厂商提供包括IaaS、PaaS、SaaS在内的多层次服务。文章还对比了云计算与网格计算的差异,指出云计算更具商业可行性,而网格计算更适用于科研领域。互联网巨头通过多元化业务实现盈利,包括电商、广告、云服务等不同模式。 阅读详情

介绍

它是一个建立在全文搜索引擎 Apache Lucene 基础上的,实时的分布式搜索和分析引擎,它可以用于全文搜索,结构化搜索以及分析。

1 索引 index
一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母的 ),并且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。在一个集群中,可以定义任意多的索引。
2 类型 type
在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类 / 分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。高版本ES 中逐渐抛弃了 type 的概念,会有一个默认的 type:_doc
3 字段 Field
相当于是数据表的字段,对文档数据根据不同属性进行的分类标识
4 映射 mapping
mapping 是处理数据的方式和规则方面做一些限制,如某个字段的数据类型、默认值、分析器、是否被索引等等,这些都是映射里面可以设置的,其它就是处理es 里面数据的一些使用规则设置也叫做映射,按着最优规则处理数据对性能提高很大,因此才需要建立映射,并且需要思考如何建立映射才能对性能更好。
5 文档 document
一个文档是一个可被索引的基础信息单元。比如,你可以拥有某一个客户的文档,某一个产品的一个文档,当然,也可以拥有某个订单的一个文档。文档以JSON ( Javascript Object Notation )格式 来表示,而 JSON 是一个到处存在的互联网数据交互格式。在一个index/type 里面,你可以存储任意多的文档。注意,尽管一个文档,物理上存在于一个索引之中,文档必须被索引/ 赋予一个索引的 type 。
6 接近实时 NRT
Elasticsearch 是一个接近实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1 秒以内)
7 cluster
集群( Cluster ) 一个 Elasticsearch 集群由多个节点( Node )组成,每个集群都有一个共同的 集群名称 作为标识
节点( Node )
一个 Elasticsearch 实例即一个 Node ,一台机器可以有多个实例,正常使用下每个实例都应该会部署在不同的机器上。Elasticsearch 的配置文件中可以通过 node.master 、 node.data 来设置节点类型。
  • node.master:表示节点是否具有成为主节点的资格
  • true代表的是有资格竞选主节点
  • false代表的是没有资格竞选主节点
  • node.data:表示节点是否存储数据
Node 节点组合
主节点 + 数据节点( master+data ) 默认
        节点既有成为主节点的资格,又存储数据
        node.master: true
        node.data: true
数据节点( data )
        节点没有成为主节点的资格,不参与选举,只会存储数据
        node.master: false
        node.data: true
客户端节点( client )
        不会成为主节点,也不会存储数据,主要是针对海量请求的时候可以进行负载均衡
        node.master: false
        node.data: false
分片
每个索引有 1 个或多个分片,每个分片存储不同的数据。分片可分为主分片( primary shard )和复制分片(replica shard ),复制分片是主分片的拷贝。默认每个主分片有一个复制分片,每个索引的复制分片的数量可以动态地调整,复制分片从不与它的主分片在同一个节点上
副本
这里指主分片的副本分片(主分片的拷贝)
提高恢复能力:当主分片挂掉时,某个复制分片可以变成主分片;
提高性能: get 和 search 请求既可以由主分片又可以由复制分片处理;
分片和复制的数量可以在索引创建 的时候指定。在索引创建之后,你可以在任何时候动态地改变复制的数量,但是你事后不能改变分片的数量。
默认情况下, Elasticsearch 中的每个索引被分片 5 个主分片和 1 个复制,这意味着,如果你的集群中至少有两个节点,你的索引将会有5 个主分片和另外5个复制分片(1个完全拷贝),这样的话每个索引总共就有10个分片。

搭建配置

systemctl stop firewalld.service # 停止 firewall
systemctl disable firewalld.service # 禁止 firewall 开机启动
firewall-cmd --state # 查看防火墙
下载 Elasticsearch 地址: https://www.elastic.co/cn/downloads/elasticsearch 最新版本
cd /opt/lxq/software
tar -zxvf elasticsearch-7.3.0-linux-x86_64.tar.gz -C ../servers
cd ../servers/
mv elasticsearch-7.3.0/ elasticsearch/
vim /opt/lxq/servers/elasticsearch/config/elasticsearch.yml
node.name: node-1
network.host: linux121
#
# Set a custom port for HTTP:
#
http.port: 9200
cluster.initial_master_nodes: ["node-1"]
vim /opt/lxq/servers/elasticsearch/config/jvm.options
-Xms2g
-Xmx2g
要新增个用户 root用户无法启动ES
useradd estest
# 修改密码
passwd estest
chown -R estest /opt/lxq/servers/elasticsearch/
ES 因为需要大量的创建索引文件,需要大量的打开系统的文件,所以我们需要解除 linux 系统当中打开文件最大数目的限制,不然ES 启动就会抛错
vim /etc/sysctl.conf 末尾添加: vm.max_map_count=655360
sysctl -p
修改 linux 系统对文件描述符的限制级别
vim /etc/security/limits.conf末尾添加:
* soft nofile 65536
* hard nofile 65536
* soft nproc 4096
* hard nproc 4096
启动ES
su estest
/opt/lxq/servers/elasticsearch/bin/elasticsearch
访问一下:http://linux121:9200

集群配置

第一步:先更改上面已经安装的那台ES的配置

cd /opt/lxq/servers/es/elasticsearch/config
vim elasticsearch.yml内容如下:
# 集群名字
cluster.name: myes
## 集群中当前的节点
node.name: linux121
## 数据目录
path.data: /opt/lxq/servers/data/es
# # 日志目录
path.logs: /opt/lxq/servers/logs/es
# 当前主机的ip地址
network.host: linux121
http.port: 9200
#初始化一个新的集群时需要此配置来选举master
cluster.initial_master_nodes: ["linux121","linux122","linux123"]
#写入候选主节点的设备地址
discovery.seed_hosts: ["linux121", "linux122","linux123"]
http.cors.enabled: true
http.cors.allow-origin: "*"

第二步:其它机子也要弄好防火墙,创好用户,root不能启动

第三步:分发/opt/lxq/servers/es/elasticsearch到其它两台机子

第四步:其它机子要改elasticsearch.yml文件,只要改node.name,network.host就行了,改成自己当前机子

所有机子启动,这里是后台启动,要发现错误的话,去 /opt/lxq/servers/logs/es 目录下查看。
nohup /opt/lxq/servers/es/elasticsearch/bin/elasticsearch >/dev/null 2>&1 &

访问一下:http://linux12[1,2,3]:9200/?pretty    pretty是美化输出格式

操作命令

# 创建索引

PUT /索引名称
{
    "settings": {
        "属性名": "属性值"
    }
}

# 判断索引是否存在 200 - OK 就是存在的

HEAD /索引名称

# 获取索引详情

GET / 索引名称1,索引2,索引3....
# 查看所有索引详情,下面两种都行
GET _all
GET /_cat/indices?v
# 打开索引
POST / 索引名称 /_open
# 关闭索引
POST / 索引名称 /_close
# 删除索引
DELETE / 索引名称 1, 索引名称 2, 索引名称 3...
# 配置索引映射
PUT / 索引库名 /_mapping
{
"properties": {
        "字段名 ": {
                "type": "数据类型",
                "index": true, // 是否索引,不索引就无法针对这个字段查询
                "store": false, // 存储 , 默认不存储, _source: 存储了文档的所有字段内容;从 _source 字段中可以获取所有字段,但是需要自己解析,如果对某个字段指定了存储,在查询时直接指定返回的字段会增加io 开销。
                "analyzer": "分词器",
                "format" : "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
                }
        }
}
示例:
PUT /lxq-company-index
PUT /lxq-company-index/_mapping/
{
"properties": {
"name": {
"type": "text",
"analyzer": "ik_max_word"
},
"job": {
"type": "text",
"analyzer": "ik_max_word"
},
"logo": {
"type": "keyword",
"index": "false"
},
"payment": {
"type": "float"
}
}
}
# 获取索引映射详情
GET / 索引名称 /_mapping
# 查看所有映射
GET _mapping       GET _all/_mapping
# 修改索引映射
PUT / 索引库名 /_mapping
{
"properties": {
" 字段名 ": {
"type": " 类型 ",
"index": true,
"store": true,
"analyzer": " 分词器 "
}
}
}
# 一次性创建索引和映射
put / 索引库名称
{
"settings":{
" 索引库属性名 ":" 索引库属性值 "
},
"mappings":{
"properties":{
" 字段名 ":{
" 映射属性名 ":" 映射属性值 "
}
}
}
}
# 创建文档 —— 手动指定id
POST / 索引名称 /_doc/{id}
# 创建文档 —— 自动生成id
POST / 索引名称 /_doc
{
"field":"value"
}
# 获取文档详情 重要的是:_source存着文档的全部内容
GET / 索引名称 /_doc/{id}

# 查询所有文档

POST / 索引名称 /_search
{
"query":{
"match_all": {
}
}
}
#  某些业务场景下,我们不需要搜索引擎返回 source 中的所有字段,可以使用 source 进行定制,如下,多个字段之间使 用逗号分隔
GET /lxq-company-index/_doc/1?_source=name,job
# 全局更新文档 下面的5代表id,id存在则更新文档内容,id不存在则新增文档内容
PUT /lxq-company-index/_doc/5
{
"name" : " 百度 ",
"job" : " 大数据工程师 ",
"payment" : "300000",
"logo" :
"http://www.lgstatic.com/thubnail_120x120/i/image/M00/21/3E/CgpFT1kVdzeAJNbUAABJB7x9sm83
74.png"
}
注意:Elasticsearch执行更新操作的时候, Elasticsearch 首先将旧的文档标记为删除状态,然后添加新的文档 ,旧的文档不会立即消失,但是你也无法访问,Elasticsearch 会在你继续添加更多数据的时候在后台清理已经标记为删除状态的文档。
全部更新,是直接把之前的老数据,标记为删除状态,然后,再添加一条更新的(使用 PUT 或者 POST ) 局部更新,只是修改某个字段(使用POST )

# 局部更新文档

POST / 索引名 /_update/{id}
{
"doc":{
"field":"value"
}
}
# 删除文档
DELETE / 索引名 /_doc/{id}
POST / 索引库名 /_delete_by_query
{
"query": {
"match": {
" 字段名 ": " 搜索关键字 "
}
}
}
POST / 索引名 /_delete_by_query
{
"query": {
"match_all": {}
}
}

查询DSL(Domain Specific Language 特定域的语言)AST(抽象语法树)

Elasticsearch 提供了基于 JSON 的完整查询 DSL ( Domain Specific Language 特定域的语言)来定义查询。将查询DSL视为查询的 AST (抽象语法树),它由两种子句组成:
  • 叶子查询子句 叶子查询子句 在特定域中寻找特定的值,如 match,term或 range查询。
  • 复合查询子句 复合查询子句包装其他叶子查询或复合查询,并用于以逻辑方式组合多个查询(例如 bool或dis_max查询),或更改其行为(例如 constant_score查询)。
我们在使用 ElasticSearch 的时候,避免不了使用 DSL 语句去查询,就像使用关系型数据库的时候要学会 SQL 语法一样。
基本语法
POST / 索引库名 /_search
{
"query":{
"查询类型 例如: match_all , match , term , range 等等":{
" 查询条件 ":" 查询条件值 "
}
}
}
match 类型查询,会把查询条件进行分词,然后进行查询 , 多个词条之间是 or 的关系
POST /lxq-property/_search
{
"query":{
"match":{
"title":" 小米电视 4A"
}
}
}
这个结果不仅会查询到电视,而且与小米相关的都会查询到,多个词之间是 or 的关系。
"title": {"query": "小米电视4A" ,"operator": "and" }只有同时包含 小米 和 电视 的词条才会被搜索到。
match_phrase 是分词的, text 也是分词的。 match_phrase 的分词结果必须在 text 字段分词中都包含,而且顺序必须相同,而且必须都是连续的
GET /lxq-property/_search
{
"query": {
"match_phrase": {
"title": " 小米电视 "
}
}
}
Query String Query 提供了无需指定某字段而对文档全文进行匹配查询的一个高级查询 , 同时可以指定在哪些字段上进行匹配。该查询与match 类似,但是 match 需要指定字段名 query_string 是在所有字段中搜索,范围更广泛。
# 默认 和 指定字段
GET /lxq-property/_search
{
"query": {
"query_string" : {
"query" : "2699"
}
}
}
GET /lxq-property/_search
{
"query": {
"query_string" : {
"query" : "2699",
"default_field" : "title"
}
}
}
# 逻辑查询
GET /lxq-property/_search
{
"query": {
"query_string" : {
"query" : " 手机 OR 小米 ",
"default_field" : "title"
}
}
}
GET /lxq-property/_search
{
"query": {
"query_string" : {
"query" : " 手机 AND 小米 ",
"default_field" : "title"
}
}
}
# 模糊查询
GET /lxq-property/_search
{
"query": {
"query_string" : {
"query" : " 大米 ~1",
"default_field" : "title"
}
}
}
# 多字段支持
GET /lxq-property/_search
{
"query": {
"query_string" : {
"query":"2699",
"fields": [ "title","price"]
}
}
}
如果你需要在多个字段上进行文本搜索,可用 multi_match 。 multi_match 在 match 的基础上支持对多个字段进行文本查询。
GET /lxq-property/_search
{
"query": {
"multi_match" : {
"query":" 小米 4A",
"fields": [ "title","images"]
}
}
}
可以使用 term-level queries 根据结构化数据中的精确值查找文档。结构化数据的值包括日期范围、 IP 地址、价格或产品ID 。与全文查询不同,term-level queries 不分析搜索词。相反,词条与存储在字段级别中的术语完全匹配。
term 查询用于查询指定字段包含某个词项的文档
POST /book/_search
{
"query": {
"term" : { "name" : "solr" }
}
}
terms 查询用于查询指定字段包含某些词项的文档
GET /book/_search
{
"query": {
"terms" : { "name" : ["solr", "elasticsearch"]}
}
}
gte :大于等于
gt :大于
lte :小于等于
lt :小于
boost :查询权重:在多条件组合查询时,可以手动控制每个条件的比重
GET /book/_search
{
"query": {
"range" : {
"price" : {
"gte" : 10,
"lte" : 200,
"boost" : 2.0
}
}
}
}
GET book/_search
{
"query": {
"range" : {
"timestamp" : {
"gte": "18/08/2020",
"lte": "2021",
"format": "dd/MM/yyyy||yyyy"
}
}
}
}
查询指定字段值不为空的文档。相当 SQL 中的 column is not null
GET /book/_search
{
"query": {
"exists" : { "field" : "price" }
}
}
词项前缀搜索(prefix query)
GET /book/_search
{ "query": {
"prefix" : { "name" : "so" }
}
}
regexp 允许使用正则表达式进行 term 查询 . 注意 regexp 如果使用不正确,会给服务器带来很严重的性能压力。比如 .*开头的查询,将会匹配所有的倒排索引中的关键字,这几乎相当于全表扫描,会很慢。因此如果可以的话,最好在使用正则前,加上匹配的前缀。
GET /book/_search
{
"query": {
"regexp":{
"name": "s.*"
}
}
}
GET /book/_search
{
"query": {
"regexp":{
"name":{
"value":"s.*",
"boost":1.2
}
}
}
}
模糊搜索(fuzzy query)
GET /book/_search
{
"query": {
"fuzzy" : { "name" : "sol" }
}
}
GET /book/_search
{
"query": {
"fuzzy" : { "name" : "so" }
}
}
GET /book/_search
{
"query": {
"fuzzy" : {
"name" : {
"value": "so"
"fuzziness": 2
}
}
}
}
GET /book/_search
{
"query": {
"fuzzy" : {
"name" : {
"value": "sorl"
}
}
}
}
POST /book/_search
{
"query": {
"fuzzy": {
"name": {
"value": "osrl",
"fuzziness":2
}
}
}
}
ids 搜索 (id 集合查询 )
GET /book/_search
{
"query": {
"ids" : {
"values" : ["1", "3"]
}
}
}
bool 查询用 bool 操作来组合多个查询子句为一个查询。 可用的关键字:
must :必须满足
filter :必须满足,对集合包含 / 排除的简单检查,计算速度非常快,不参与、不影响评分
should :或
must_not :必须不满足,在 filter 上下文中执行,不参与、不影响评分
示例:description 中必须包含 java,
price 必须满足大于 100 小于 1000 ,
name 字段可以是 lucene 或者是 solr 中的一种即可,
时间满足。。。。
POST /book/_search
{
"query": {
"bool" : {
"filter" : {
"match" : { "description" : "java" }
},
"must": [
{
"range" : {
"price" : { "gte" : 100, "lte" : 1000 }
}
},
{"bool": {
"should": [
{"term":{"name":"lucene"}},
{"term":{"name":"solr"}}
]
}}
],
"must_not": [
{
"range": {
"timestamp": {
"gte": "18/08/2020",
"lte": "2021",
"format": "dd/MM/yyyy||yyyy"
}
}
}
]
}
}
}
Elasticsearch 中的所有的查询都会触发相关度得分的计算。对于那些不需要相关度得分的场景下, Elasticsearch 以过滤器的形式提供了另一种查询功能,过滤器在概念上类似于查询,但是它们有非常快的执行速度,执行速度快主要有
以下两个原因:
  • 过滤器不会计算相关度的得分,所以它们在计算上更快一些。
  • 过滤器可以被缓存到内存中,这使得在重复的搜索查询上,其要比相应的查询快出许多。
为了理解过滤器,可以将一个查询(像是 match_all , match , bool 等)和一个过滤器结合起来。我们以范围过滤器为例,它允许我们通过一个区间的值来过滤文档。这通常被用在数字和日期的过滤上。 下面这个例子使用一个被过滤的查询,其返回price 值是在 200 到 1000 之间(闭区间)的书。
示例:
POST /book/_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"range": {
"price": {
"gte": 200,
"lte": 1000
}
}
}
}
}
}
通常情况下,要决定是使用过滤器还是使用查询,你就需要问自己是否需要相关度得分。如果相关度是不重要的,使用过滤器,否则使用查询。查询和过滤器在概念上类似于SELECT WHERE 语句。
排序  并在搜索结果中通过 _score 参数返回, 默认排序是 _score 降序,按照相关性评分升序排序如下
POST /book/_search
{
"query": {
"match": {"description":"solr"}
},
"sort": [
{"_score": {"order": "asc"}} // _score可以换成自己的字段
]
"sort": [
{ "price": { "order": "desc" }},
{ "timestamp": { "order": "desc" }}
],
"size": 2,
"from": 2,
"highlight": {
"pre_tags": "<font color='pink'>",
"post_tags": "</font>",
"fields": [{"name":{}}]
}
}
size: 每页显示多少条
from: 当前页起始索引 , int start = (pageNum - 1) * size
高亮
POST /book/_search
{
"query": {
"query_string" : {
"query" : "elasticsearch"
}
},
"highlight": {
"pre_tags": "<font color='pink'>",
"post_tags": "</font>",
"fields": [{"name":{}},{"description":{}}]
}
}
⭐⭐⭐    以下操作面向文档   ⭐⭐⭐
mget 批量查询多个文档
GET /_mget
{
"docs" : [
{
"_index" : "book",
"_id" : 1
},
{
"_index" : "book",
"_id" : 2
}
]
}
GET /book/_mget
{
"docs" : [
{
"_id" : 2
},
{
"_id" : 3
}
]
}
搜索简化写法
POST /book/_search
{
"query": {
"ids" : {
"values" : ["1", "4"]
}
}
}
Bulk 操作解释将文档的增删改查一些列操作,通过一次请求全都做完。减少网络传输次数。
如下操作,删除 1 ,新增 5 ,修改 2 。
POST /_bulk
{ "delete": { "_index": "book", "_id": "1" }}
{ "create": { "_index": "book", "_id": "5" }}
{ "name": "test14","price":100.99 }
{ "update": { "_index": "book", "_id": "2"} }
{ "doc" : {"name" : "test"} }
实际用法:bulk请求一次不要太大,否则一下积压到内存中,性能会下降。所以,一次请求几千个操作、大小在几M 正好。 bulk会将要处理的数据载入内存中,所以数据量是有限的,最佳的数据两不是一个确定的数据,它取决于你 的硬件,你的文档大小以及复杂性,你的索引以及搜索的负载。 一般建议是1000-5000个文档,大小建议是5- 15MB,默认不能超过100M,可以在es的配置文件(ES的config下的elasticsearch.yml)中配置。
http.max_content_length: 10mb
聚合介绍
POST /book/_search
{
"size": 0,
"aggs": {
"max_price": {
"max": {
"field": "price"
}
}
}
}
### count
POST /book/ _count
{
"query": {
"range": {
"price" : {
"gt":100
}
}
}
}
# 统计条数 (value_count 统计某个字段有值的数量 )
POST /book/_search
{
"size": 0,
"aggs": {
"book_nums": {
"value_count": {
"field": "_id"
}
}
}
}
stats 统计 count max min avg sum 5 个值
POST /book/_search?size=0
{
"aggs": {
"price_stats": {
"stats": {
"field": "price"
}
}
}
}
高级统计,比 stats 多 4 个统计结果: 平方和、方差、标准差、平均值加 / 减两个标准差的区间
group by  having
POST /book/_search
{
"size": 0,
"aggs": {
"group_by_price": {
"range": {
"field": "price",
"ranges": [
{
"from": 0,
"to": 200
},
{
"from": 200,
"to": 400
},
{
"from": 400,
"to": 1000
}
]
},
"aggs": {
"average_price": {
"avg": {
"field": "price"
}
},
"having": {
"bucket_selector": {
"buckets_path": {
"avg_price": "average_price"
},
"script": {
"source": "params.avg_price >= 200 "
}
}
}
}
}
}
}

每台机器都要配置IK分词器。配置完成之后,需要重启ES服务

安装配置

!!!在elasticsearch安装目录的plugins目录下新建 analysis-ik 目录
#  新建 analysis-ik 文件夹
mkdir analysis-ik
#  切换至 analysis-ik 文件夹下
cd analysis-ik
#  上传下载的 elasticsearch-analysis-ik-7.3.0.zip
#  解压
unzip elasticsearch-analysis-ik-7.3.3.zip
如果解压出现:-bash: unzip: command not found
需要安装:yum install -y unzip
#  解压完成后删除 zip
rm -rf elasticsearch-analysis-ik-7.3.0.zip
#  分发到其它节点
cd ..
scp -r analysis-ik/ linux122:$PWD
scp -r analysis-ik/ linux123:$PWD
#  杀死 es
ps -ef|grep elasticsearch|grep bootstrap |awk '{print $2}' |xargs kill -9
#  启动
nohup /opt/lxq/servers/es/elasticsearch/bin/elasticsearch >/dev/null 2>&1 &
#  重启 kibana
cd /opt/lxq/servers/kibana/
/bin/kibana

用法讲解

扩展词 :就是不想让哪些词被分开,让他们分成一个词。比如上面的江大桥
停用词 :有些词在文本中出现的频率非常高。但对本文的语义产生不了多大的影响。例如英文的 a 、 an 、 the 、 of 等。或中文的” 的、了、呢等 ” 。这样的词称为停用词。停用词经常被过滤掉,不会被进行索引。在检索的过程中,如果用户的查询词中含有停用词,系统会自动过滤掉。停用词可以加快索引的速度,减少索引库文件的大小。
扩展词与停用词集中存储到 linux123 服务器上,使用 web 服务器集中管理,避免每个节点维护一份自己的词典
Linux123使用es用户 部署Tomcat,可参考我这边文章: Linux——CentOS7安装到Tomcat安装完成_linux c7 crontab.tar.gz安装包下载-优快云博客

《《《《《 简单嘞😀 》》》》》》

tomcat装完之后,配置需要的停用词,拓展词

cd /opt/lxq/servers/es/tomcat/webapps/ROOT
vim ext_dict.dic内容如下:
的
了
啊
启动tomcat:/opt/lxq/servers/es/tomcat/bin/startup.sh
访问:http://linux123:8080/ext_dict.dic 词就配置好了,接下来要es能获取到我们配置的词
#  三个节点都需修改 建议用root用户改
cd /opt/lxq/servers/es/elasticsearch/plugins/analysis-ik/config
vim 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"></entry>
<!-- 用户可以在这里配置自己的扩展停止词字典 -->
<entry key="ext_stopwords"></entry>
<!-- 用户可以在这里配置远程扩展字典 -->
<entry key="remote_ext_dict">http://linux123:8080/ext_dict.dic</entry>
<!-- 用户可以在这里配置远程扩展停止词字典 -->
<entry key="remote_ext_stopwords">http://linux123:8080/stop_dict.dic</entry>
</properties>
#  杀死 es
ps -ef|grep elasticsearch|grep bootstrap |awk '{print $2}' |xargs kill -9
#  启动
nohup /opt/lxq/servers/es/elasticsearch/bin/elasticsearch >/dev/null 2>&1 &
#  重启 kibana
cd /opt/lxq/servers/kibana/
/bin/kibana
# 验证分词器
POST _analyze
{
"analyzer": "ik_smart",
"text": " 南京市长江大桥 "
}

界面(不用es head 用Kibana)

操作系统能装的版本

tar -zxvf kibana-7.3.0-linux-x86_64.tar.gz -C ../servers/
cd ../servers/
mv kibana-7.3.0-linux-x86_64/ kibana/
chown -R es /opt/lxq/servers/kibana
chmod -R 777 /opt/lxq/servers/kibana
vim /opt/lxq/servers/kibana/config/kibana.yml内容如下:
server.port: 5601
server.host: "linux121"
# The URLs of the Elasticsearch instances to use for all your queries.
elasticsearch.hosts: ["http://linux121:9200","http://linux122:9200","http://linux123:9200"]
切换用户
su es
cd /opt/lxq/servers/kibana/
/bin/kibana
访问 linux121:5601 ,即可看到安装成功,《《《《《《《简单嘞 😀》》》》》》

拓展

扩展kibana dev tools快捷键:
ctrl+enter 提交请求
ctrl+i 自动缩进

倒排索引

Elasticsearch 使用一种称为倒排索引的结构,它适用于快速的全文搜索。一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表。
例如,假设我们有两个文档,每个文档是如下内容:
1. The quick brown fox jumped over the lazy dog
2. Quick brown foxes leap over lazy dogs in summer
要创建倒排索引,首先要将每个文档内容拆分成单独的词,创建一个包含所有不重复词条的排序列表,然后列出每个词条出现在哪个文档

感谢阅读!!!

Visual Studio 2013 + Intel(R) Visual Fortran 安装教程 安装了好几遍,ivf都不能加载到vs中,中途放弃了vs,又改用codeblocks编译器,依然在写fortran的时候出现了各种问题,于是又放弃了codeblocks改回vs,总之是折腾了好久,终于装明白了ivf并且将fortran模板成功加载到vs中。 PS:一定要安装Intel Visual Fortran.Composer XE.2013-SP1,不要用Intel Visual Fortr... 阅读详情

相关推荐

LAMMPS实操系列(一): 大量FCC-CoCrCuFeNi高熵合金建模与最稳定结构筛选

高熵合金(High-entropy alloys,HEA),是由五种或五种以上等量或大约等量金属形成的合金。由于高熵合金可能具有许多优秀的物理化学性质,因此在材料科学领域受到广泛关注

Ceshigo_CD的博客 3257

Elasticsearch搜索引擎

Elasticsearch搜索引擎

m0_73922877的博客 1359

基于用户的协同过滤算法(userCF)

1.定义 userCF:当一个用户A需要个性化推荐时,可以先找到和他有相似兴趣的其他用户,然后把那些用户喜欢的、而用户A没有听说过的物品推荐给A。这种方法称为基于用户的协同过滤算法。 基于用户的协同过滤算法主要包括两个步骤: 2.第一步:找到和目标用户兴趣相似的用户集合。 利用行为的相似度计算兴趣的相似度。给定用户u和用户v,令N(u)表示用户u曾经有过正反馈的物品集合,令N(v)为用户v曾经有过...

jiangdongxiaobawang的博客 1万+

Elasticsearch搜索引擎入门到进阶

Elasticsearch是基于Lucene构建的开源搜索引擎,它提供了一个分布式、RESTful的搜索和分析引擎,能够对数据进行实时分析。其高度可扩展性和灵活性使其在处理复杂数据搜索需求时表现出色。优势特点:分布式存储:Elasticsearch可以在多台服务器上存储和检索数据,实现高可用性和负载均衡。:通过HTTP请求,可以轻松地与其他应用程序集成。本文详细介绍了Elasticsearch搜索引擎的入门到进阶内容,从基础概念、搜索查询到性能优化和实践应用等方面进行了全面阐述。

emilio15979289的博客 414

企业微信获取code,URL详解

“https://open.weixin.qq.com/connect/oauth2/authorize?”+ “appid=”企业ID “&redirect_uri=”重定向路径+ “&agentid=”小程序AgentId+ “&response_type=code&scope=snsapi_userinfo&state=123&conn...

weixin_44804985的博客 8733

arcgis根据矢量范围统计栅格数据众数、最大值、均值、中位数、最小值、少数等

像元统计数据 根据多个栅格数据计算每个像元的统计数据。 可用的统计数据有:众数、最大值、均值、中位数、最小值、少数、范围、标准差、总和及变异度。 https://desktop.arcgis.com/zh-cn/arcmap/10.3/tools/spatial-analyst-toolbox/an-overview-of-the-local-tools.htm ...

GIS哼哈哈的博客 6万+

ElasticSearch 认识和安装ES

es是一个分布式、高性能的搜索引擎,广泛应用于大数据检索、日志分析、实时搜索等场景。与传统数据库相比,ElasticSearch 对于大规模数据的处理具有显著优势,特别是模糊查询、分词分析、语义理解等复杂搜索任务。本章内容主要是介绍了 Elasticsearch 的基础知识、它的起源以及如何安装和配置 Elasticsearch 和 Kibana。安装过程中使用 Docker 是一种方便快捷的方式,可以轻松启动单机模式的 Elasticsearch 服务,并结合 Kibana 进行可视化操作。

2301_80093566的博客 1844

Python 爬虫实战:科研数据库学术论文数据抓取

在科研工作中,学术论文是获取前沿知识和研究方法的重要资源。然而,手动从科研数据库中查找和整理论文信息往往耗时费力。幸运的是,Python 爬虫技术可以自动化这一过程,帮助我们高效地抓取和管理学术论文数据。本文将详细介绍如何使用 Python 爬虫技术抓取科研数据库中的学术论文数据,并进行全字段提取和文献管理,助力科研工作。

u014481728的博客 944

搜索引擎之ElasticSearch(es)入门学习、ELK 和 beats

好记星不如烂笔头,这里记录平时工作中用到的东西,不喜可以留言。 ElasticSearch为啥要用 ElasticSearch简称es是一个ElasticSearch是一个分布式,高性能、高可用、可伸缩的搜索和分析系统 。可以当做一个上层数据库来使用和关系数据库和Nosql有一定区别和相似性。使用es的几个原因: 关系型数据库模糊搜索不足索引,会全表扫描非常慢。%关键词%这种搜索会非常慢。主...

dazer的专栏 1万+

【N32L40X】学习笔记12-规则组+注入组+外部触发启动

使用定时器触发规则通道开始采集数据,采集完成后使用dma传输数据,并启动注入通道转换数据,注入通道转换完成后产生中断,中断中读物注入通道数据。

Car12 422

史上最全工商银行核心系统建设历程:从“数据集中”到“ECOS”2.0,见证银行业信息科技跨时代发展征程

ECOS工程的直接成果是建成了工商银行第五代信息系统,即从单一核心银行系统到去核心化开放生态系统,率先开启了以智能化、开放化为特征,数据驱动引领经营模式变革,创新提出了一整套国际领先的分布式开放生态银行系统建设方案,在大型银行全分布式系统架构、主机下移、银行系统生态化转型、大规模交易型分布式数据库等多个领域再次实现“0到1”的突破,建成了具备国际领先水平的全分布式开放生态银行系统,继续勇立数字化转型潮头,推动高质量发展再上新台阶。工商银行的业务连续性管理水平实现了跨越式发展,有力地保障了业务发展。

银行信息系统应用架构详解 824

Elasticsearch入门:构建强大的搜索引擎

Elasticsearch是基于Lucene构建的开源搜索引擎,它提供了分布式存储、快速搜索和分析能力。分布式:Elasticsearch可以在多个节点上存储和搜索数据,支持水平扩展和负载均衡。实时性:Elasticsearch能够实时更新索引,并支持实时搜索。灵活性:支持多种数据类型和复杂的查询语法。通过本文的介绍,我们了解了Elasticsearch的基本概念、安装与配置、操作实践以及性能优化。Elasticsearch作为一种强大的搜索引擎,可以帮助我们快速检索和管理大规模数据。

2501_92488994的博客 509

华为OD机试 - 整型数组按照个位数排序(Python/JS/C/C++ 双机位C卷 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。给定一个非空数组(列表),其元素数据类型为整型,请按照数组元素十进制最低位从小到大进行排序,十进制最低位相同的元素,相对位置保持不变。当数组元素为负值时,十进制最低位等同于去除符号位后对应十进制值最低位。给定一个非空数组,其元素数据类型为32位有

学Java,找哪吒 399

【搜索引擎:Elasticsearch】从0了解ES,整合springboot,京东搜索实战

📣 📣 📣 📢📢📢 ☀️☀️你好啊!小伙伴,我是小冷。是一个兴趣驱动自学练习两年半的的Java工程师。 📒 一位十分喜欢将知识分享出来的Java博主⭐️⭐️⭐️,擅长使用Java技术开发web项目和工具 📒 文章内容丰富:覆盖大部分java必学技术栈,前端,计算机基础,容器等方面的文章 📒 如果你也对Java感兴趣,关注小冷吧,一起探索Java技术的生态与进步,一起讨论Java技术的使用与学习 ✏️高质量技术专栏专栏链接: 微服务,数据结构,netty,单点登录,SSM ,SpringCloudAli.

doomwatcher的博客 2289

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

ElasticSearch搜索引擎搭建笔记

搜索引擎调研 Solr Solr是一个用java开发的独立的企业级搜索应用服务器,它提供了类似于Web-service的API接口,它是基于Lucene的全文检索服务器,也算是Lucene的一个变种,很多一线互联网公司都在使用Solr,也算是一种成熟的解决方案. 官方主页:http://lucene.apache.org/solr/ Elasticsearch Elast...

liuxing93619的博客 4980

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

大数据在搜索引擎中的优化与创新

1.背景介绍 搜索引擎是现代互联网的核心基础设施之一,它通过索引和检索互联网上的信息,为用户提供所需的信息。随着互联网的迅速发展,搜索引擎面临着巨大的数据量和复杂性的挑战。大数据技术在搜索引擎中的应用和创新,为提高搜索质量和效率提供了有力支持。 本文将从以下六个方面进行阐述: 背景介绍 核心概念与联系 核心算法原理和具体操作步骤以及数学模型公式详细讲解 具体代码实例和详细解释说明 未来发展...

AI天才研究院 1512

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

ES - ElasticSearch基础概念详解

Elasticsearch(简称ES)是一个基于Apache Lucene构建的开源、分布式、RESTful接口的全文搜索引擎,Elasticsearch通过对Lunece的封装,隐藏了复杂性,提供了使用简单的RESTful Api。Elasticsearch还是一个分布式文档数据库,其中每个字段均可被索引,而且每个字段的数据均可被搜索,因为对文档进行了分词处理。ES能够横向扩展至数以百计的服务器存储以及处理PB级的数据,可以在极短的时间内存储、搜索和分析大量的数据。

深入Java世界:探索编程之美与技术深度 2937

Elasticsearch(ES)搜索引擎

假如我们要查第100页数据,每页查十条,也就是查第990到1000这十条数据。但并不是简单的查到这1000条数据然后返回最后十条,而是把每个分片前1000条数据都拿出来合并到一起排序,选出前1000条然后返回最后十条。当要查询第一万页数据时,数据量极大,可能会导致内存炸裂。不能修改索引库已有的字段,因为之前创建好的倒排索引跟分词会受到干扰,对索引库影响很大。数据库采用正向索引:一般情况下会根据id创建索引,形成B+树,如果根据id检索效率就会比较高。先创建好mapping映射,在Java客户端创建索引库。

2401_87882047的博客 536

ES既是搜索引擎又是数据库?真的有那么全能吗?

作者介绍李猛(ynuosoft),Elastic-stack产品深度用户,ES认证工程师,2012年接触Elasticsearch,对Elastic-Stack开发、架构、运维等方面有深...

架构师小秘圈 1555

ElasticSearch全文搜索引擎基础入门

一、ES的介绍 1、ES概述 ES是一个使用Java语言并且基于Lucene编写的搜索引擎框架,他提供了分布式的全文搜索功能,提供了一个统一的基于RESTful风格的WEB接口,官方客户端也对多种语言都提供了相应的API。 Lucene:Lucene本身就是一个搜索引擎的底层。 分布式:ES主要是为了突出他的横向扩展能力。 全文检索:将一段词语进行分词,并且将分出的单个词语统一的放到一个分词库中,在搜索时,根据关键字去分词库中检索,找到匹配的内容。(倒排索引) RESTful风格的WEB接口:操作ES很简单

java编程学习_java基础教程_booyzhang的博客 515

为什么Elasticsearch能吊打其他搜索引擎?揭秘毫秒级检索的底层原理

Elasticsearch(ES)凭借6大核心优化成为高性能搜索引擎:1)分布式分片架构实现并行计算;2)倒排索引快速定位文档;3)文件系统缓存热数据内存计算;4)近实时搜索1秒可查;5)多层智能缓存减少重复计算;6)硬件与JVM优化。相比Solr和MySQL,ES在索引速度、查询延迟和扩展性上表现更优。要最大化性能需合理分片(20-50GB/片)、利用缓存、配置SSD硬件及优化查询语句。本文深入解析了ES的极速原理及实践优化方案。

xinxinaitoutou的博客 1625

高性能分布式搜索引擎Elasticsearch详解

分词器的作用是什么?创建倒排索引时,对文档分词用户搜索时,对输入的内容分词IK分词器有几种模式?ik_smart:智能切分,粗粒度:最细切分,细粒度IK分词器如何拓展词条?如何停用词条?利用config目录的文件添加拓展词典和停用词典在词典中添加拓展词条或者停用词条。

莫道桑榆晚,为霞尚满天 1748

es 其实是不是就是数据库_ES既是搜索引擎又是数据库?真的有那么全能吗?

原标题:ES既是搜索引擎又是数据库?真的有那么全能吗?作者介绍李猛(ynuosoft),Elastic-stack产品深度用户,ES认证工程师,2012年接触Elasticsearch,对Elastic-Stack开发、架构、运维等方面有深入体验,实践过多种Elasticsearch项目,最暴力的大数据分析应用,最复杂的业务系统应用;业余为企业提供Elastic-stack咨询培训以及调优实施。E...

weixin_39671405的博客 812

Elasticsearch 第一期:ES的前世今生

虽然在之前的工作中,多多少少用过ES,有在开发用的,也有在运维过程中接触的。但没有系统看到ES的相关知识和发展。通过这次的学习和整理,明白ES不是凭空出现的,也不是独立发展的。

bigben 1452

终于有人把搜索引擎讲明白了

导读:我们现在正处在一个信息过载的时代。全世界每年产生1EB到2EB (1EB≈1018B)信息,相当于地球上每个人每年大概产生250MB信息。其中,纸质信息仅占所有信息的0.03%。静态...

大数据 4747

什么是搜索引擎?有什么作用?

什么是搜索引擎?有什么作用?01 什么是搜索引擎及搜索系统02 搜索引擎的发展史03 搜索引擎的分类1. 全文搜索引擎2. 元搜索引擎3. 垂直搜索引擎4. 目录搜索引擎 作者:大数据DT 来源:大数据DT 导读:我们现在正处在一个信息过载的时代。 全世界每年产生1EB到2EB (1EB≈1018B)信息,相当于地球上每个人每年大概产生250MB信息。其中,纸质信息仅占所有信息的0.03%。 静态网页有上百亿,动态及隐藏网页至少是静态网页的500倍。Tom Landauer认为人的大脑只能存储约200M

一个写湿的程序猿 8959
上一篇: 数据仓库理论
下一篇: 大数据计算引擎(四)—— Impala
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值