1.Get Index 查看索引的定义信息
GET /twitter,可以一次获取多个索引(以逗号间隔) 获取所有索引 _all 或 用通配符*
GET /twitter/_settings
GET /twitter/_mapping
http://127.0.0.1:9200/indexName/
http://127.0.0.1:9200/indexName/_mapping
2、创建别名后,直接使用就可以,作为indexName, 不需要做特殊操作
PUT /_aliases
{
"actions": [
{
"add": {
"index": "index_one",
"alias": "index_one_alias"
}
}
]
}
3、查看集群索引详情
http://127.0.0.1:9200/_cat/indices?v
查看健康状况
http://127.0.0.1:9200/_cat/health?v
查看线程池
http://127.0.0.1:9200/_cat/thread_pool/search?pretty
查看线程池具体情况(默认线程池个数:(cpu核数3)/2+1)
http://127.0.0.1:9200/_cat/thread_pool/search?h=nn,i,n,s,r
删除索引
curl -XDELETE http://127.0.0.1:9200/indexName (如果想批量删除,就使用indexName)
4、查询索引中的数据
http://127.0.0.1:9200/indexName/_search?q=* 默认返回前10条数据
5、按条件查询索引数据
GET http://127.0.0.1:9200/indexName/_search
json body:
{"query":{"bool":{"must":{"term":{"id.keyword":"001"}}}}} 查询符合条件的数据,默认10条
{"query":{"bool":{"must":{"term":{"id.keyword":"001"}}}},"size":20} 指定查询条数
6、根据id删除数据
curl -XDELETE http://127.0.0.1:9200/indexName/indexType/id
7、查询
查询条件:
全文检索:
match
match query,即匹配查询,接受text/numerics/dates查询参数,分析它们并构造查询。包含查询关键词分词中的任何一个或多个的文档都会被查询出来。
{
"query": {
"match": {
"content" : "测试查询"
}
}
}
{
"query": {
"match": {
"content" : {
"query" : "测试查询",// 有额外参数时,查询文本放在query中
"operator": "or"
}
}
}
}
match_phrase
match phrase query,即匹配短语查询,它其实是在match的基础上将operator改为and的效果,只有文档的字段完全匹配查询文本的所有分词短语才会该文档返回。它的语法为:(语法和match很相似)
match_phrase_prefix
match phrase prefix query,即匹配短语前缀查询
术语查询:
term
term是代表完全匹配,即不进行分词器分析,文档中必须包含整个搜索的词汇
term query查找指定字段的倒排索引中指定的确切术语的文档。它对大小写敏感且不会对查询参数分析,所以常用在对关键字、数字、日期字段查找值。其实,当字段的数据类型是"text",最好不要使用term查询, 因为原文档会被分词,分词后,完整的字段可能无法匹配。
{
"query": {
"term": {
"content": "汽车保养"
}
}
}
range
range query查找指定字段包含指定范围内的值(日期,数字或字符串)的文档。range接受以下参数:gte 、gt、lte、lt和boost(表示匹配分值),
bool联合查询: must,should,must_not
如果我们想要请求"content中带宝马,但是tag中不带宝马"这样类似的需求,就需要用到bool联合查询。
联合查询就会使用到must,should,must_not,filter三种关键词。
must: 返回的文档必须满足must子句的条件,并且参与计算分值
should: 返回的文档可能满足should子句的条件。在一个Bool查询中,如果没有must或者filter,有一个或者多个should子句,那么只要满足一个就可以返回。如果有must或者filter,should子句会失效,即使should子句都不满足,也可以正常返回,可以通过设置minimum_should_match参数定义了至少满足几个子句,来解决该问题。
must_not: 返回的文档必须不满足must_not定义的条件。
filter:返回的文档必须满足filter子句的条件。但是不会像must一样,参与计算分值
比如上面那个需求:
{
"query": {
"bool": {
"must": {
"term": {
"content": "宝马"
}
},
"must_not": {
"term": {
"tags": "宝马"
}
}
}
}
}
数组查询
这个问题其实涉及好几个相关的知识点。
ES对于数组类型的写入和查询是怎样的
如何查询数组为空的记录
在ES中,没有专门的数组数据类型,但是默认情况下,任意一个字段都可以包含0或多个值,这意味着每个字段默认都是数组类型。不过ES要求数组类型的各个元素值的数据类型必须相同。比如,下面这种数组就就无法存入ES。
[ 10, "apple" ]
但是下面这几种就可以,
[ "apple", "orange" ]
[ 1, 2 ]
下面回到问题。看要求应该是需要关键字匹配,所以字段的mapping类型可以设置为keyword,然后查询使用term查询。
mapping如下:
PUT my_index
{
"mappings": {
"properties": {
"job_type": {
"type": "keyword"
}
}
}
}
然后写入两条文档,第二条是空的。
PUT my_index/_doc/1
{
"job_type": ["a", "b", "c"]
}
PUT my_index/_doc/2
{
"job_type": []
}
查询包含b的记录,
GET my_index/_search
{
"query": {
"bool": {
"must": [
{"term": {
"job_type": {
"value": "b"
}
}}
]
}
}
}
高亮查询:
//配置标题高亮显示
HighlightBuilder highlightBuilder = new HighlightBuilder(); //生成高亮查询器
highlightBuilder.field(title); //高亮查询字段
highlightBuilder.field(content); //高亮查询字段
highlightBuilder.requireFieldMatch(false); //如果要多个字段高亮,这项要为false
highlightBuilder.preTags("<span style=\"color:red\">"); //高亮设置
highlightBuilder.postTags("</span>");
//下面这两项,如果你要高亮如文字内容等有很多字的字段,必须配置,不然会导致高亮不全,文章内容缺失等
highlightBuilder.fragmentSize(800000); //最大高亮分片数
highlightBuilder.numOfFragments(0); //从第一个分片获取高亮片段
highlightBuilder.order(HighlightBuilder.Order.SCORE);//order是关键,这个就是加完高亮标签之后,然后按照标签多少来排序的。待验证
查询问题:
1、should失效问题
当使用should查询时,如果包含了must或者filter查询,那么should的查询语句就不是或者的意思了,而是有或者没有都行的含义。
解决方案:
1.在bool条件中使用minimum_should_match,至少匹配一项should子句
{
"query":{
"bool":{
"must":[
{
"term":{
"sex":"男"
}
}
],
"should":[
{
"term":{
"name":"ceshi"
}
}
],
"minimum_should_match":1
}
}
}
2、index定义问题
尽量不要使用默认standard分词器。分词器对中文不太友好,会将中文分成一个一个的中文汉字,对查询结果也不友好。
定义:
{
"fieldName":{
"type":"keyword",
"field":{
"ik":{
"type":"text",
"analyzer":"ik_max_word"
}
}
}
}
按如上定义,就可以标明fieldName的分词使用ik, 查询时,使用fieldName.ik 就可以按照ik分词查询。使用filedName精确查找。
若按如下定义,fieldName查询时就按默认分词器分词了。使用fieldName.keyword精确查找。所以定义index时要考虑清楚。
{
"fieldName":{
"type":"text",
"field":{
"keyword":{
"type":"keyword"
}
}
}
}
命名问题:
{
"field_name":{
"type":"keyword",
"field":{
"ik":{
"type":"text",
"analyzer":"ik_max_word"
}
}
}
}
如果定义的属性名是用下划线分割的,则在java DTO定义中,需要使用 @JSONField定义index中对应的属性字段名称,否则插入后,会新增一个属性为fileName的字段。
@JSONField(name="filed_name")
private String fileName;
es性能问题:
1、出现线程池拒绝
调整elasticsearch.yml配置processors参数,调整值得大小,可以设置为cpu核数的一半。
参考文档
https://www.cnblogs.com/yjf512/p/4897294.html
https://blog.csdn.net/sym542569199/article/details/85018527
https://blog.csdn.net/pony_maggie/article/details/108523816
https://blog.csdn.net/qq_37644899/article/details/99721586
https://www.pianshen.com/article/8846278050/
https://blog.csdn.net/JineD/article/details/111997205
https://blog.csdn.net/paditang/article/details/78802799