美文网首页
Elasticsearch 使用手记

Elasticsearch 使用手记

作者: zxbyh | 来源:发表于2023-05-06 18:10 被阅读0次

下载并启动

进入官网https://www.elastic.co/cn/elasticsearch/

image.png

选下载


image.png image.png

然后解压到文件夹


image.png
最新版本的自带jdk。
windows下运行这个bat就可以启动
image.png

然我遇到错误: 说找不到 C:\Program Files\java\jdk-19\lib\dt.jar 文件.

继续检查,发现是用java14以上版本的已经没有这个了,但是我在环境变量里面设置了classpath 5B47GN0B}@7GOUP9FRAV}E5.png

. 其实这个设置是有问题的.干掉这个.
然后在命令行允许elasticsearch.bat


image.png

但是会报错:org.elasticsearch.ElasticsearchSecurityException:
这是因为没有设置证书的原因,接下来要设置证书
进入 D:\work\elasticsearch-8.7.1\bin 运行 elasticsearch-certutil ca


8SW8}MWT_P}EFOU(3MEWQXR.png image.png image.png

使用第一步生成的证书,生成p12秘钥

elasticsearch-certutil cert --ca elastic-stack-ca.p12


image.png image.png image.png

拷贝密钥


image.png

注意要 新建文件夹certs

现在再次启动,
然后访问 http://127.0.0.1:9200/ 没有反应
报错

image.png
原因是Elasticsearch在Windows下开启了安全认证,虽然started成功,但访问http://localhost:9200/失败。
解决方案:

找到config/目录下面的elasticsearch.yml配置文件,把安全认证开关从原先的true都改成false,实现免密登录访问即可,修改这两处都为false后:


image.png

再次启动,就可以访问了。


image.png

然后使用就参考这几个文章
https://blog.csdn.net/she8656837/article/details/129421606
https://www.jianshu.com/p/3ee165eeba23
https://blog.csdn.net/chemmeng/article/details/128219146

一、名词解释

1)索引

在7.X版本前类似于[关系型数据库]中的数据库概念,8.X版本后删除了type概念,索引类似于关系型数据库中的表

2)文档

相当于关系型数据库中的一条数据,最小单元

二、索引CRUD

1)创建索引

PUT /indexName?pretty

2)查询操作

# 查询索引信息
GET _cat/indices?v
# 查询所有数据
GET /indexName/_search
# 查询第一条数据
GET /indecName/_doc/1

3)删除操作

# 删除索引
DELETE /indexName?pretty
#删除数据
DELETE /indexName/_doc/id
  1. 插入数据
#插入数据 指定id
PUT /indexName/_doc/id
{
    Json数据
}
# 示例
PUT /product/_doc/1
{
    "name":"手机",
    "price":"1399",
    "desc":["美观","小巧"]
}

5)修改数据

1. 同插入数据,全量替换

2. 指定字段更新(两种格式均可)

POST /indexName/_doc/1 _update
{
  "doc":{
     "fieldName":""
   }
}
 
POST /indexName/_update/id
{
  "doc":{
     "fieldName":""
   }
}

需要注意的是 指定id必须要用put


}D$Y%RAT%@}L}70%UIJE%T7.png

注意在 ES 7.0 之后,一个索引只能有一个 _doc(之前是type),所以一个索引只对应一个 Mapping
在7.X版本前类似于[关系型数据库]中的数据库概念,8.X版本后删除了type概念,索引类似于关系型数据库中的表

还有_mapping 的相关文档

这儿做一个demo来实验一下这些功能:

1 创建索引
这儿命名shopping 相当于关系数据库里面的一个表.
put 请求 http://127.0.0.1:9200/shopping

image.png

2 查看索引
GET 请求 : http://127.0.0.1:9200/shopping

image.png

3 多条件查询 & 范围查询
多条件查询
假设想找出小米牌子,价格为3999元的。(must相当于数据库的&&)

在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:

{
    "query":{
        "bool":{
            "must":[{
                "match":{
                    "category":"小米"
                }
            },{
                "match":{
                    "price":3999.00
                }
            }]
        }
    }
}

设置 ik 分词器

默认的分词器对中文没法用.


image.png

安装ik分词器:
下载最新的8.7.0 以后可能还会更新,到时候修改版本号就可以了.
https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v8.7.0/elasticsearch-analysis-ik-8.7.0.zip
然后在 elasticsearch 的plugins 文件下面新建 ik 文件夹,吧下载的内容放进去.

image.png

重新启动elasticsearch,发现报错:
Plugin [analysis-ik] was built for Elasticsearch version 8.7.0 but version 8.7.1 is running


image.png

需要在ik的配置文件里面修改一下Elasticsearch 的版本号
\plugins\ik目录下,找到plugin-descriptor.properties文件,将文件中的elasticsearch.version=改为自己的ES版本号


image.png

然后再次启动Elasticsearch


image.png

改成用ik进行分词 就可以了

注意:在ik分词器中提供了两种分词算法

ik_smart:  最少切分
ik_max_word:  最细粒度划分
image.png image.png

自定义分词组合

有的时候,这两种算法拆分的词语你还是不满意,并没有按照你的要求来拆分,怎么办呢?很好办的。

b41974012ef8d75e4fcf4833808e3d92_b808f49fe5dd892355d53a19436cbb34.png
30dcf0582e398ada259ed4c253ac52c9_2be9dc9cb89146851bf4f8ab348ee711.png
ecdd8e1a739863f54b95fbee289fc4bc_f9f972191ea87660d448b8d60fddb7f4.png
69cf7d64b914d1a375784fd39bbd26c8_6c5056686eb3bb506d72dfe2e343fb87.png aa7773ac4a9e948c62ca567d0378730e_9494786fdbb47e0fdd66af45c49f8ea2.png
dd3a2c0a5835257eb2303a333af2bc27_07b7f3867f2afff5d3146455a214f9a0.png

现在来整个跑一个案例

一 创建一个索引并指定字段的类型

put http://127.0.0.1:9200/goods

{
    "mappings":{
        "properties":{
            "title":{
                "type": "text",
                "analyzer":"ik_max_word"
            },
            "category":{
                "type": "text",
                "analyzer":"ik_smart"
            },
            "images":{
                "type": "text"
            },
            "price":{
                "type": "integer"
            }
        }
    }
}
image.png

给这个索引添加记录
put http://127.0.0.1:9200/goods/_doc/1

{
    "title": "立白大师香氛洗衣液柔顺护衣持久留香洗衣香水内衣可用6.24kg",
    "category" : "立白",
    "images" : "http : // www.gulixueyuan.com /xm.jpg",
    "price" : 2999
}
image.png

继续添加一些内容.

也可以复制索引内容


image.png

现在来查看已经有的文档内容

get http://127.0.0.1:9200/goods/_search

{
    "took": 716,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 5,
            "relation": "eq"
        },
        "max_score": 1,
        "hits": [
            {
                "_index": "goods",
                "_id": "1",
                "_score": 1,
                "_source": {
                    "title": "立白大师香氛洗衣液柔顺护衣持久留香洗衣香水内衣可用6.24kg",
                    "category": "立白",
                    "images": "http : // www.gulixueyuan.com /xm.jpg",
                    "price": 2999
                }
            },
            {
                "_index": "goods",
                "_id": "2",
                "_score": 1,
                "_source": {
                    "title": "海飞丝全新专研去屑止痒控油洗发水300g 蓬松控油 针对油性头皮 无硅油",
                    "category": "海飞丝",
                    "images": "http : // www.gulixueyuan.com /xm.jpg",
                    "price": 79
                }
            },
            {
                "_index": "goods",
                "_id": "3",
                "_score": 1,
                "_source": {
                    "title": "佳洁士香氛双色锁白牙膏美白去黄去牙渍防渍含氟清新口气白桃牙膏90g",
                    "category": "佳洁士",
                    "images": "http://www.gulixueyuan.com/xm.jpg",
                    "price": 19
                }
            },
            {
                "_index": "goods",
                "_id": "4",
                "_score": 1,
                "_source": {
                    "title": "潘婷丝质顺滑洗护套装洗发水500g+护发素500g+洗发水80g 越洗越柔顺",
                    "category": "潘婷",
                    "images": "http://www.gulixueyuan.com/xm.jpg",
                    "price": 137.9
                }
            },
            {
                "_index": "goods",
                "_id": "5",
                "_score": 1,
                "_source": {
                    "title": "同仁堂(TRT)防脱育发洗发水生姜脱发控油护发洗发水400ML",
                    "category": "同仁堂(TRT)",
                    "images": "http://www.gulixueyuan.com/xm.jpg",
                    "price": 137.9
                }
            }
        ]
    }
}

对于开始没有设定分词器的索引,查询的结果。这显然是不合理的


image.png

设定了分词器的,查询结果。


image.png

比如输入"海飞丝洗发水", 搜出的第一个就是 名称全部都含有"海飞丝"和"洗发水"的, 后面就是有"洗发水"的,说明分词起到效果了.

image.png

常用的查询技巧

  1. 匹配多个词语:
    使用 bool 查询和 must 子句可以匹配多个词语。例如,匹配同时包含“apple”和“banana”的文档:
{
  "query": {
    "bool": {
      "must": [
        { "match": { "text": "apple" }},
        { "match": { "text": "banana" }}
      ]
    }
  }
}
  1. 匹配某个字段中的任意一个词:
    使用 terms 查询和字段名可以匹配某个字段中的任意一个词。例如,匹配 title 字段中包含“apple”或“banana”的文档:
{
  "query": {
    "terms": {
      "title": ["apple", "banana"]
    }
  }
}
  1. 匹配某个字段中的词语前缀:
    使用 prefix 查询和字段名可以匹配某个字段中的词语前缀。例如,匹配 title 字段中以“app”开头的文档:
{
  "query": {
    "prefix": {
      "title": "app"
    }
  }
}
  1. 匹配某个字段中的词语通配符:
    使用 wildcard 查询和字段名可以匹配某个字段中的词语通配符。例如,匹配 title 字段中包含“app”或“ban”的文档:
{
  "query": {
    "wildcard": {
      "title": "*app* OR ban*"
    }
  }
}
  1. 匹配某个字段中的词语模糊匹配:
    使用 fuzzy 查询和字段名可以进行词语模糊匹配。例如,匹配 title 字段中类似于“aple”的文档:
{
  "query": {
    "fuzzy": {
      "title": "aple"
    }
  }
}
  1. 匹配某个字段中的词语范围:
    使用 range 查询和字段名可以匹配某个字段中的词语范围。例如,匹配 price 字段在 10 到 100 之间的文档:
{
  "query": {
    "range": {
      "price": {
        "gte": 10,
        "lte": 100
      }
    }
  }
}
  1. 匹配某个字段中的词语存在与否:
    使用 exists 查询和字段名可以匹配某个字段中的词语是否存在。例如,匹配包含 description 字段的文档:
{
  "query": {
    "exists": {
      "field": "description"
    }
  }
}
  1. 按照某个字段排序:
    使用 sort 参数可以按照某个字段进行排序。例如,按照 score 字段从高到低排序:
{
  "query": {
    "match_all": {}
  },
  "sort": [
    { "score": "desc" }
  ]
}
  1. 返回某些字段的部分数据:
    使用_source 参数可以返回某些字段的部分数据。例如,只返回 title 和 price 字段的数据:
{
  "query": {
    "match_all": {}
  },
  "_source": ["title", "price"]
}
  1. 进行分页操作:
    使用 from 和 size 参数可以进行分页操作。例如,返回第 11-20 条数据:
{
  "query": {
    "match_all": {}
  },
  "from": 10,
  "size": 10
}

相关文章

网友评论

      本文标题:Elasticsearch 使用手记

      本文链接:https://www.haomeiwen.com/subject/odpcsdtx.html