elaticsearch文档查询以及分词器

补充上一章
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, 在文件里添加自己的词典的路径。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值