补充上一章:
5.0.的head连接上6.0的elasticsearch,但是无法获取数据, 因为6.0增加了请求头严格校验的原因,并且返回的结果是
{
"error" : "Content-Type header [application/x-www-form-urlencoded] is not supported",
"status" : 406
}
解决方法:elasticsearch-head 5的配置文件。
因为docker容器里面无法使用vi/vim,所以需要先将文件拷贝出来。
命令:docker cp es_head:/usr/src/app/_site/vendor.js ./
说明:将容器里面/usr/src/app/_site/vendor.js文件拷贝到宿主机的当前目录下,其中es_head为容器名,也可以写容器id。
2、编辑文件
vi vendor.js
共有两处
1)6886行
contentType: "application/x-www-form-urlencoded
改成
contentType: "application/json;charset=UTF-8"
2)7573行
var inspectData = s.contentType === "application/x-www-form-urlencoded" &&
改成
var inspectData = s.contentType === "application/json;charset=UTF-8" &&
补充说明
vi中显示行号的命令为
:set nu
vi中跳转到指定行的命令为
:行号
3、将改完后的文件拷贝回容器
docker cp vendor.js es_head:/usr/src/app/_site
无需重启,刷新页面即可。
原文链接:https://blog.csdn.net/qq_31142553/article/details/99689758
pretty:
http://127.0.0.1:8088/usr/1001?pretty
在查询后面添加pretty可以帮助美化返回的json。
查询响应:如果不需要全部的字段,可以指定某些需要的字段进行返回
http://127.0.0.1:8088/usr/1001?_source=id,name
判断文档是否存在: 如果只是查询文档是否存在,而不是查询文档内容
HEAD请求 http://***:8088/user/1001 返回200存在 404不存在
批量操作:批量减少可以减少网络请求。如:批量查询、批量插入数据
Post:/user/1001/_mget //批量获取下面json串的id的数据
参数:{
“ids”:[“1001”,“1002”]
}
_bulk操作:支持批量的插入、修改、删除操作,都是通过_bulk的api完成的
批量插入数据: 最后一行要有回车
{“create”:{"_index":“haoke”,"_type":“user”,"_id":2001}}
{“id”:2001,“name”:“name1”,“age”: 20,“sex”: “男”}
{“create”:{"_index":“haoke”,"_type":“user”,"_id":2002}}
{“id”:2002,“name”:“name2”,“age”: 20,“sex”: “男”}
{“create”:{"_index":“haoke”,"_type":“user”,"_id":2003}}
{“id”:2003,“name”:“name3”,“age”: 20,“sex”: “男”
批量删除数据:
{“delete”:{"_index":“haoke”,"_type":“user”,"_id":2001}}
{“delete”:{"_index":“haoke”,"_type":“user”,"_id":2002}}
其他操作类似。
一次批量请求的性能值:不是固定的一个值,取决于硬件、文档的大小和复杂度以及索引和搜索的负载。 整个批量请求会被加载到接受请求节点的内存里,所以请求越大,给其他请求可用的内存就越小,有一个最佳的bulk 请求大小,超过这个大小,性能不会再提升甚至可能降低
分页操作: 接收from 跳过开始的结果数 和size结果数 参数
url /_search?size=5
url /_search?from=1&size=1
当分页太深或者一次请求太多的时候,结果会在返回前会被排序,一般一个搜索往往是从多个分片总搜索,那么这些分片中会排序好再返回。
在集群系统中深度分页:
在集群中深度分页是有问题的,比如在五个主分页中搜索第1000-10010页,每个分片都会产生顶端的10010个结果,然后请求节点排序这50050个结果选出10个最终结果,最终会丢弃50040个,开销过大
这也是在网络搜索引擎中任何语句不能反悔多余1000个结果的原因。
映射:
我们创建和插入的索引,elasticsearch会自动帮我们判断,特殊场景我们需要进行明确的字段类型指定。
结构化查询:
term查询:精准匹配哪些值,比如数字,日期,布尔值或 not_analyzed 的字符串(未经分析的文本数据类型)
{
"query" : {
"term" : {
"age" : 20
}
}
}
terms查询: 可以指定多个查询条件
{
"terms": {
"tag": [ "search", "full_text", "nosql" ]
}
}
range查询: 范围查询
{
"range": {
"age": {
"gte": ?20,
"lt": ?30
}
}
*
exists查询:可以用于查找文档中是否包含指定字段或没有某个字段match查询
match查询:标准查询,在真正查询前用分析器分析match一查询字符串
bool查询:可以用来合并多个条件查询结果的bool逻辑,它包含操作符:
must:多个查询条件的完全匹配,相当于and
must_not:多个查询条件的相反匹配,相当于not
should:至少有一个查询条件或者一个查询条件的数组。
{
"bool": {
"must": ??{ "term": { "folder": "inbox" }},
"must_not": { "term": { "tag": "spam" }},
"should": [
{ "term": { "starred": true ?}},
{ "term": { "unread": ?true ?}}
]
}
}
过滤查询:
{
"query":{
"bool":{
"filter":{
"exists":{
"field":"age"
}
}
}
}
}
过滤查询和查询的对比:
做精确匹配搜索时,最好用过滤语句,因为过滤语句可以缓存数据。
一条过滤语句会询问每个文档的字段值是否包含着特定值。
查询语句会询问每个文档的字段值与特定值的匹配程度如何。
一条查询语句会计算每个文档与查询语句的相关性,会给出一个相关性评分 _score,并且 按照相关性对
匹配到的文档进行排序。 这种评分方式非常适用于一个没有完全配置结果的全文本搜索。
一个简单的文档列表,快速匹配运算并存入内存是十分方便的, 每个文档仅需要1个字节。这些缓存的过滤结
果集与后续请求的结合使用是非常高效的。
查询语句不仅要查找相匹配的文档,还需要计算每个文档的相关性,所以一般来说查询语句要比 过滤语句更
耗时,并且查询结果也不可缓存。
分词:
将一个文本转换成一系列单词的过程,也叫文本分析,在Elastisearch 中也成为Analies
用途: 排查问题
内置分词:
standard:按单词区分
simple:按非单词区分
whitespace:按空格区分不做大小写转换
stop:按语气助词区分 the an等…
keyword:不做分词 传入什么就是什么
中文分词器: IK/jieba/THULAC,推荐使用Ik
docker安装IK:
先将文件zip拷贝到容器里: docker cp /tmp/elasticsearch-analysis-ik-6.5.4.zip
进入docker,在plugins下创建文件夹: mkdir ik
将拷贝的文件移动到ik文件夹里:mv elasticsearch-analysis-ik-6.5.4.zip ./ik
解压: unzip elasticsearch-analysis-ik-6.5.4.zip
重启容器即可。
使用IK:
{
“analyzer”:“ik_max_word”,
“text”:“我超级美丽,我是i中国人”
}
如果传入的词汇没有被识别到,那么也可以手动上传让id知道这个词语。
自定义词库:
到ik目录的config下,找到IKAnalyzer.config.xml, 在文件里添加自己的词典的路径。