https://es.xiaoleilu.com/010_Intro/15_API.html Es电子书30分钟入门。看完可以自己用c#或java写个框架了。
https://www.elastic.co/guide/cn/elasticsearch/guide/current/_retrieving_a_document.html Es官网,这个随便看一看吧,主要是上面。
https://www.jianshu.com/p/07c4dddae43a linux中 curl命令参数解释,需看懂这个才知道用。
Es常用http请求:
curl -X
VERB HTTP方法:GET, POST, PUT, HEAD, DELETE
PROTOCOL http或者https协议(只有在Elasticsearch前面有https代理的时候可用)
HOST Elasticsearch集群中的任何一个节点的主机名,如果是在本地的节点,那么就叫localhost
PORT Elasticsearch HTTP服务所在的端口,默认为9200
PATH API路径(例如_count将返回集群中文档的数量),PATH可以包含多个组件,例如_cluster/stats或者_nodes/stats/jvm
QUERY_STRING 一些可选的查询请求参数,例如?pretty参数将使请求返回更加美观易读的JSON数据
BODY 一个JSON格式的请求主体(如果请求需要的话)
elaticsear no [query] registered for [filtered] 过滤查询错误
https://blog.csdn.net/zhongzunfa/article/details/81147906
es进行聚合操作时提示Fielddata is disabled on text fields by default 错误,用put解决
https://blog.csdn.net/u011403655/article/details/71107415
es自动生成的id长22个字符为uuid。
问题:
关于分词的大部分 Mapping 是无法修改的,即便能修改也是没有意义的;
因为修改前的数据并不会因为你的修改而生效,你必需重新覆盖写入才能生效,所以依旧推荐新建索引,然后使用 reindex 同步数据。
http://localhost:9200/_cat/indices?v 所有索引列表
http://localhost:9200/_cat/nodes?v 所有节点列表
其实常用的在上面的Es电子书中有。这里主要记录ik分词器的使用,首先你的Es得装上ik分词器。有 ik_smart 和 ik_max_word两个。这里记录 ik_samrt 。
测试ik分词的效果
get 192.168.50.233:9200/_analyze?pretty
raw text
{
"analyzer": "ik_smart",
"text": "中华人民共和国国歌"
}
结果:分成了两个,自行测试 ik_max_word的效果。也可以测试 standard 标准分词器的效果。
{
"tokens": [
{
"token": "中华人民共和国",
"start_offset": 0,
"end_offset": 7,
"type": "CN_WORD",
"position": 0
},
{
"token": "国歌",
"start_offset": 7,
"end_offset": 9,
"type": "CN_WORD",
"position": 1
}
]
}
ik分词主要用于中文搜索时可以很好的分词搜索,达到预期效果。
但所有的index/type/id中的属性字段默认使用standard分词器,ik分词器需要手动映射到对应的属性字段才能使用。(其它分词器也一样)
映射如下:给testliuyan/person下的属性name映射ik分词器,前提是person对象不存在或name属性字段不存在,因为已存在的话,默认已使用了标准分词器,使用下面的http请求会报错。可以映射完之后,再添加数据,这时person数据对应name属性字段默认才使用ik分词器,但其他字段还是标准分词器。但映射之前又需索引存在
加个索引,但无数据
put 192.168.50.233/索引名称
put 192.168.50.233:9200/testliuyan/_mapping/person
{
"properties": {
"name": {
"type": "string",
"analyzer": "ik_smart"
}
}
}
结果:
{
"acknowledged": true
}
即代表映射成功。
添加一条数据来测试:
put 192.168.50.233:9200/testliuyan/person/2
{
"name":"123浙江中好国",
"oname":"123浙江中好国"
}
查询:
get 192.168.50.233:9200/testliuyan/person/_search
{
"query" : {
"match" : {
"name" : "中国"
}
}
}
结果:
无,因为 ik分词器将 中国 看为一个整体。
把上面换成查字段 oname,该字段使用默认分词器。
则会查出刚刚我们加的那条数据,因为默认分词器将 中国 分为 中 和 国 , 数据只要包含这两个中一个即可。
其实还有一种方法可以配置Es全局属性,可以设置ik分词为默认配置,不用一个一个索引去设置了。
put http://192.168.50.233:9200/_template/rtf
{
"template": "*",
"mappings": {
"_default_": {
"_all": {
"enabled": true
},
"dynamic_templates": [
{
"strings": {
"match_mapping_type": "string",
"mapping": {
"type": "text",
"analyzer":"ik_max_word",
"ignore_above": 256,
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
]
}
}
}
get是查看配置
不过和上面的一样,新数据有效,旧数据由于已经映射了以前的默认分词。现在改配置也无法生效。
解决办法:
https://blog.csdn.net/aiyaya_/article/details/79567091
https://blog.csdn.net/tclzsn7456/article/details/79958554
可以通过重建索引解决,不过这里只能一条一条索引去搞。
对于以前的大量索引我也是无能为力,希望有人告知如何解决?
教程:https://www.cnblogs.com/Dev0ps/p/9493576.html
1、#删除指定索引
# curl -XDELETE -u elastic:changeme http://localhost:9200/acc-apply-2018.08.09
{"acknowledged":true}
2、#删除多个指定索引,中间用逗号隔开
# curl -XDELETE -u elastic:changeme http://localhost:9200/acc-apply-2018.08.09,acc-apply-2018.08.10
3、#模糊匹配删除
# curl -XDELETE -u elastic:changeme http://localhost:9200/acc-apply-*
{"acknowledged":true}
4、#使用通配符,删除所有的索引
curl -XDELETE http://localhost:9200/_all
或 curl -XDELETE http://localhost:9200/*
_all ,* 通配所有的索引
通常不建议使用通配符,误删了后果就很严重了,所有的index都被删除了
禁止通配符为了安全起见,可以在elasticsearch.yml配置文件中设置禁用_all和*通配符
action.destructive_requires_name = true
这样就不能使用_all和*了
5、#获取当前索引
# curl -u elastic:changeme 'localhost:9200/_cat/indices?v'
6、如果存储不够可以设置定时删除,下面是保留3天的日志
30 2 * * * /usr/bin/curl -XDELETE -u elastic:changeme http://localhost:9200/*-$(date -d '-3days' +'%Y.%m.%d') >/dev/null 2>&1
以下是定时删除脚本:
1 2 3 |
|
如果你的es实在是没有ik分词器这种东西,那就只好在搜索之前用第三方其他的分词接口分词了,然后再把结果使用es中的短语匹配,同样可以达到分词搜索的效果。
es中短语匹配的用法:
get 192.168.50.233:9200/nowuser3/newcomputer/_search
{
"query": {
"bool": {
"should": [
{ "match_phrase": { "name": "中国浙江" }},
{ "match_phrase": { "name": "345" }}
]
}
}
}
中国浙江 和 345 为第三方其他分词接口将原搜索字符串分好后返回的结果。
Es中匹配name包含中国浙江 或 name包含345的结果。
如果把should改成must,should代表or , must代表 and.
还有一种 must not 一看就懂。