温馨提示:本文所有API操作都是基于Elasticsearch 7.17 .8版本
1、文档的基本 CRUD 与批量操作
############Create Document############ #create document. 自动生成 _id POST users/_doc { "user" : "Mike", "post_date" : "2019-04-15T14:12:12", "message" : "trying out Kibana" } #create document. 指定Id。如果id已经存在,报错 PUT users/_doc/1?op_type=create { "user" : "Jack", "post_date" : "2019-05-15T14:12:12", "message" : "trying out Elasticsearch" } #create document. 指定 ID 如果已经存在,就报错 PUT users/_create/1 { "user" : "Jack", "post_date" : "2019-05-15T14:12:12", "message" : "trying out Elasticsearch" } ### Get Document by ID #Get the document by ID GET users/_doc/1 ### Index & Update #Update 指定 ID (先删除,在写入) GET users/_doc/1 PUT users/_doc/1 { "user" : "Mike" } #GET users/_doc/1 #在原文档上增加字段 POST users/_update/1/ { "doc":{ "post_date" : "2019-05-15T14:12:12", "message" : "trying out Elasticsearch" } } ### Delete by Id # 删除文档 DELETE users/_doc/1 ### Bulk 操作 #执行两次,查看每次的结果 #执行第1次 POST _bulk { "index" : { "_index" : "test", "_id" : "1" } } { "field1" : "value1" } { "delete" : { "_index" : "test", "_id" : "2" } } { "create" : { "_index" : "test2", "_id" : "3" } } { "field1" : "value3" } { "update" : {"_id" : "1", "_index" : "test"} } { "doc" : {"field2" : "value2"} } #执行第2次 POST _bulk { "index" : { "_index" : "test", "_id" : "1" } } { "field1" : "value1" } { "delete" : { "_index" : "test", "_id" : "2" } } { "create" : { "_index" : "test2", "_id" : "3" } } { "field1" : "value3" } { "update" : {"_id" : "1", "_index" : "test"} } { "doc" : {"field2" : "value2"} } ### mget 操作 GET /_mget { "docs" : [ { "_index" : "test", "_id" : "1" }, { "_index" : "test", "_id" : "2" } ] } #URI中指定index GET /test/_mget { "docs" : [ { "_id" : "1" }, { "_id" : "2" } ] } GET /_mget { "docs" : [ { "_index" : "test", "_id" : "1", "_source" : false }, { "_index" : "test", "_id" : "2", "_source" : ["field3", "field4"] }, { "_index" : "test", "_id" : "3", "_source" : { "include": ["user"], "exclude": ["user.location"] } } ] } ### msearch 操作 POST kibana_sample_data_ecommerce/_msearch {} {"query" : {"match_all" : {}},"size":1} {"index" : "kibana_sample_data_flights"} {"query" : {"match_all" : {}},"size":2} ### 清除测试数据 #清除数据 DELETE users DELETE test DELETE test2
2、使用分析器进行分词
#Simple Analyzer – 按照非字母切分(符号被过滤),小写处理 #Stop Analyzer – 小写处理,停用词过滤(the,a,is) #Whitespace Analyzer – 按照空格切分,不转小写 #Keyword Analyzer – 不分词,直接将输入当作输出 #Patter Analyzer – 正则表达式,默认 \W+ (非字符分隔) #Language – 提供了30多种常见语言的分词器 #2 running Quick brown-foxes leap over lazy dogs in the summer evening #查看不同的analyzer的效果 #standard GET _analyze { "analyzer": "standard", "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening." } #simpe GET _analyze { "analyzer": "simple", "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening." } GET _analyze { "analyzer": "stop", "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening." } #stop GET _analyze { "analyzer": "whitespace", "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening." } #keyword GET _analyze { "analyzer": "keyword", "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening." } GET _analyze { "analyzer": "pattern", "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening." } #english GET _analyze { "analyzer": "english", "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening." } POST _analyze { "analyzer": "icu_analyzer", "text": "他说的确实在理”" } POST _analyze { "analyzer": "standard", "text": "他说的确实在理”" } POST _analyze { "analyzer": "icu_analyzer", "text": "这个苹果不大好吃" }
3、URI Search详解
#基本查询 GET /movies/_search?q=2012&df=title&sort=year:desc&from=0&size=10&timeout=1s #带profile GET /movies/_search?q=2012&df=title { "profile":"true" } #泛查询,正对_all,所有字段 GET /movies/_search?q=2012 { "profile":"true" } #指定字段 GET /movies/_search?q=title:2012&sort=year:desc&from=0&size=10&timeout=1s { "profile":"true" } # 查找美丽心灵, Mind为泛查询 GET /movies/_search?q=title:Beautiful Mind { "profile":"true" } # 泛查询 GET /movies/_search?q=title:2012 { "profile":"true" } #使用引号,Phrase查询 GET /movies/_search?q=title:"Beautiful Mind" { "profile":"true" } #分组,Bool查询 GET /movies/_search?q=title:(Beautiful Mind) { "profile":"true" } #布尔操作符 # 查找美丽心灵 GET /movies/_search?q=title:(Beautiful AND Mind) { "profile":"true" } # 查找美丽心灵 GET /movies/_search?q=title:(Beautiful NOT Mind) { "profile":"true" } # 查找美丽心灵 GET /movies/_search?q=title:(Beautiful %2BMind) { "profile":"true" } #范围查询 ,区间写法 GET /movies/_search?q=title:beautiful AND year:[2002 TO 2018%7D { "profile":"true" } #通配符查询 GET /movies/_search?q=title:b* { "profile":"true" } //模糊匹配&近似度匹配 GET /movies/_search?q=title:beautifl~1 { "profile":"true" } GET /movies/_search?q=title:"Lord Rings"~2 { "profile":"true" }
4、Request Body 与 Query DSL
#ignore_unavailable=true,可以忽略尝试访问不存在的索引“404_idx”导致的报错 #查询movies分页 POST /movies,404_idx/_search?ignore_unavailable=true { "profile": true, "query": { "match_all": {} } } POST /kibana_sample_data_ecommerce/_search { "from":10, "size":20, "query":{ "match_all": {} } } #对日期排序 POST kibana_sample_data_ecommerce/_search { "sort":[{"order_date":"desc"}], "query":{ "match_all": {} } } #source filtering POST kibana_sample_data_ecommerce/_search { "_source":["order_date"], "query":{ "match_all": {} } } #脚本字段 GET kibana_sample_data_ecommerce/_search { "script_fields": { "new_field": { "script": { "lang": "painless", "source": "doc['order_date'].value+'hello'" } } }, "query": { "match_all": {} } } POST movies/_search { "query": { "match": { "title": "last christmas" } } } POST movies/_search { "query": { "match": { "title": { "query": "last christmas", "operator": "and" } } } } POST movies/_search { "query": { "match_phrase": { "title":{ "query": "one love" } } } } POST movies/_search { "query": { "match_phrase": { "title":{ "query": "one love", "slop": 1 } } } }
5、Query & Simple Query String Query
PUT /users/_doc/1 { "name":"Ruan Yiming", "about":"java, golang, node, swift, elasticsearch" } PUT /users/_doc/2 { "name":"Li Yiming", "about":"Hadoop" } POST users/_search { "query": { "query_string": { "default_field": "name", "query": "Ruan AND Yiming" } } } POST users/_search { "query": { "query_string": { "fields":["name","about"], "query": "(Ruan AND Yiming) OR (Java AND Elasticsearch)" } } } #Simple Query 默认的operator是 Or POST users/_search { "query": { "simple_query_string": { "query": "Ruan AND Yiming", "fields": ["name"] } } } POST users/_search { "query": { "simple_query_string": { "query": "Ruan Yiming", "fields": ["name"], "default_operator": "AND" } } } GET /movies/_search { "profile": true, "query":{ "query_string":{ "default_field": "title", "query": "Beafiful AND Mind" } } } # 多fields GET /movies/_search { "profile": true, "query":{ "query_string":{ "fields":[ "title", "year" ], "query": "2012" } } } GET /movies/_search { "profile":true, "query":{ "simple_query_string":{ "query":"Beautiful +mind", "fields":["title"] } } }
6、Dynamic Mapping 和常见字段类型
#写入文档,查看 Mapping PUT mapping_test/_doc/1 { "firstName":"Chan", "lastName": "Jackie", "loginDate":"2018-07-24T10:29:48.103Z" } #查看 Mapping文件 GET mapping_test/_mapping #Delete index DELETE mapping_test #dynamic mapping,推断字段的类型 PUT mapping_test/_doc/1 { "uid" : "123", "isVip" : false, "isAdmin": "true", "age":19, "heigh":180 } #查看 Dynamic GET mapping_test/_mapping #默认Mapping支持dynamic,写入的文档中加入新的字段 PUT dynamic_mapping_test/_doc/1 { "newField":"someValue" } #该字段可以被搜索,数据也在_source中出现 POST dynamic_mapping_test/_search { "query":{ "match":{ "newField":"someValue" } } } #修改为dynamic false PUT dynamic_mapping_test/_mapping { "dynamic": false } #新增 anotherField PUT dynamic_mapping_test/_doc/10 { "anotherField":"someValue" } #该字段不可以被搜索,因为dynamic已经被设置为false POST dynamic_mapping_test/_search { "query":{ "match":{ "anotherField":"someValue" } } } get dynamic_mapping_test/_doc/10 #修改为strict PUT dynamic_mapping_test/_mapping { "dynamic": "strict" } #写入数据出错,HTTP Code 400 PUT dynamic_mapping_test/_doc/12 { "lastField":"value" } DELETE dynamic_mapping_test
7、显式Mapping设置与常见参数介绍
#设置 index 为 false DELETE users PUT users { "mappings" : { "properties" : { "firstName" : { "type" : "text" }, "lastName" : { "type" : "text" }, "mobile" : { "type" : "text", "index": false } } } } PUT users/_doc/1 { "firstName":"Ruan", "lastName": "Yiming", "mobile": "12345678" } POST /users/_search { "query": { "match": { "mobile":"12345678" } } } #设定Null_value DELETE users PUT users { "mappings" : { "properties" : { "firstName" : { "type" : "text" }, "lastName" : { "type" : "text" }, "mobile" : { "type" : "keyword", "null_value": "NULL" } } } } PUT users/_doc/1 { "firstName":"Ruan", "lastName": "Yiming", "mobile": null } PUT users/_doc/2 { "firstName":"Ruan2", "lastName": "Yiming2" } GET users/_search { "query": { "match": { "mobile":"NULL" } } } #设置 Copy to DELETE users PUT users { "mappings": { "properties": { "firstName":{ "type": "text", "copy_to": "fullName" }, "lastName":{ "type": "text", "copy_to": "fullName" } } } } PUT users/_doc/1 { "firstName":"Ruan", "lastName": "Yiming" } GET users/_search?q=fullName:(Ruan Yiming) POST users/_search { "query": { "match": { "fullName":{ "query": "Ruan Yiming", "operator": "and" } } } } #数组类型 PUT users/_doc/1 { "name":"onebird", "interests":"reading" } PUT users/_doc/1 { "name":"twobirds", "interests":["reading","music"] } POST users/_search { "query": { "match_all": {} } } GET users/_mapping
8、多字段特性及Mapping中配置自定义Analyzer
PUT logs/_doc/1 {"level":"DEBUG"} GET /logs/_mapping POST _analyze { "tokenizer":"keyword", "char_filter":["html_strip"], "text": "hello world" } POST _analyze { "tokenizer":"path_hierarchy", "text":"/user/ymruan/a/b/c/d/e" } #使用char filter进行替换 POST _analyze { "tokenizer": "standard", "char_filter": [ { "type" : "mapping", "mappings" : [ "- => _"] } ], "text": "123-456, I-test! test-990 650-555-1234" } //char filter 替换表情符号 POST _analyze { "tokenizer": "standard", "char_filter": [ { "type" : "mapping", "mappings" : [ ":) => happy", ":( => sad"] } ], "text": ["I am felling :)", "Feeling :( today"] } // white space and snowball GET _analyze { "tokenizer": "whitespace", "filter": ["stop","snowball"], "text": ["The gilrs in China are playing this game!"] } // whitespace与stop GET _analyze { "tokenizer": "whitespace", "filter": ["stop","snowball"], "text": ["The rain in Spain falls mainly on the plain."] } //remove 加入lowercase后,The被当成 stopword删除 GET _analyze { "tokenizer": "whitespace", "filter": ["lowercase","stop","snowball"], "text": ["The gilrs in China are playing this game!"] } //正则表达式 GET _analyze { "tokenizer": "standard", "char_filter": [ { "type" : "pattern_replace", "pattern" : "http://(.*)", "replacement" : "$1" } ], "text" : "http://www.elastic.co" }
9、Dynamic Template和Index Template10、
#数字字符串被映射成text,日期字符串被映射成日期 PUT ttemplate/_doc/1 { "someNumber":"1", "someDate":"2019/01/01" } GET ttemplate/_mapping #Create a default template PUT _template/template_default { "index_patterns": ["*"], "order" : 0, "version": 1, "settings": { "number_of_shards": 1, "number_of_replicas":1 } } PUT /_template/template_test { "index_patterns" : ["test*"], "order" : 1, "settings" : { "number_of_shards": 1, "number_of_replicas" : 2 }, "mappings" : { "date_detection": false, "numeric_detection": true } } #查看template信息 GET /_template/template_default GET /_template/temp* #写入新的数据,index以test开头 PUT testtemplate/_doc/1 { "someNumber":"1", "someDate":"2019/01/01" } GET testtemplate/_mapping get testtemplate/_settings PUT testmy { "settings":{ "number_of_replicas":5 } } put testmy/_doc/1 { "key":"value" } get testmy/_settings DELETE testmy DELETE /_template/template_default DELETE /_template/template_test #Dynaminc Mapping 根据类型和字段名 DELETE my_index PUT my_index/_doc/1 { "firstName":"Ruan", "isVIP":"true" } GET my_index/_mapping DELETE my_index PUT my_index { "mappings": { "dynamic_templates": [ { "strings_as_boolean": { "match_mapping_type": "string", "match":"is*", "mapping": { "type": "boolean" } } }, { "strings_as_keywords": { "match_mapping_type": "string", "mapping": { "type": "keyword" } } } ] } } DELETE my_index #结合路径 PUT my_index { "mappings": { "dynamic_templates": [ { "full_name": { "path_match": "name.*", "path_unmatch": "*.middle", "mapping": { "type": "text", "copy_to": "full_name" } } } ] } } PUT my_index/_doc/1 { "name": { "first": "John", "middle": "Winston", "last": "Lennon" } } GET my_index/_search?q=full_name:John
10、基于词项和基于全文的搜索
DELETE products PUT products { "settings": { "number_of_shards": 1 } } POST /products/_bulk { "index": { "_id": 1 }} { "productID" : "XHDK-A-1293-#fJ3","desc":"iPhone" } { "index": { "_id": 2 }} { "productID" : "KDKE-B-9947-#kL5","desc":"iPad" } { "index": { "_id": 3 }} { "productID" : "JODL-X-1937-#pV7","desc":"MBP" } GET /products POST /products/_search { "query": { "term": { "desc": { //"value": "iPhone" "value":"iphone" } } } } POST /products/_search { "query": { "term": { "desc.keyword": { //"value": "iPhone" //"value":"iphone" } } } } POST /products/_search { "query": { "term": { "productID": { "value": "XHDK-A-1293-#fJ3" } } } } POST /products/_search { //"explain": true, "query": { "term": { "productID.keyword": { "value": "XHDK-A-1293-#fJ3" } } } } POST /products/_search { "explain": true, "query": { "constant_score": { "filter": { "term": { "productID.keyword": "XHDK-A-1293-#fJ3" } } } } } #设置 position_increment_gap DELETE groups PUT groups { "mappings": { "properties": { "names":{ "type": "text", "position_increment_gap": 0 } } } } GET groups/_mapping POST groups/_doc { "names": [ "John Water", "Water Smith"] } POST groups/_search { "query": { "match_phrase": { "names": { "query": "Water Water", "slop": 100 } } } } POST groups/_search { "query": { "match_phrase": { "names": "Water Smith" } } }
11、结构化搜索
#结构化搜索,精确匹配 DELETE products POST /products/_bulk { "index": { "_id": 1 }} { "price" : 10,"avaliable":true,"date":"2018-01-01", "productID" : "XHDK-A-1293-#fJ3" } { "index": { "_id": 2 }} { "price" : 20,"avaliable":true,"date":"2019-01-01", "productID" : "KDKE-B-9947-#kL5" } { "index": { "_id": 3 }} { "price" : 30,"avaliable":true, "productID" : "JODL-X-1937-#pV7" } { "index": { "_id": 4 }} { "price" : 30,"avaliable":false, "productID" : "QQPX-R-3956-#aD8" } GET products/_mapping #对布尔值 match 查询,有算分 POST products/_search { "profile": "true", "explain": true, "query": { "term": { "avaliable": true } } } #对布尔值,通过constant score 转成 filtering,没有算分 POST products/_search { "profile": "true", "explain": true, "query": { "constant_score": { "filter": { "term": { "avaliable": true } } } } } #数字类型 Term POST products/_search { "profile": "true", "explain": true, "query": { "term": { "price": 30 } } } #数字类型 terms POST products/_search { "query": { "constant_score": { "filter": { "terms": { "price": [ "20", "30" ] } } } } } #数字 Range 查询 GET products/_search { "query" : { "constant_score" : { "filter" : { "range" : { "price" : { "gte" : 20, "lte" : 30 } } } } } } # 日期 range POST products/_search { "query" : { "constant_score" : { "filter" : { "range" : { "date" : { "gte" : "now-1y" } } } } } } #exists查询 POST products/_search { "query": { "constant_score": { "filter": { "exists": { "field": "date" } } } } } #处理多值字段 POST /movies/_bulk { "index": { "_id": 1 }} { "title" : "Father of the Bridge Part II","year":1995, "genre":"Comedy"} { "index": { "_id": 2 }} { "title" : "Dave","year":1993,"genre":["Comedy","Romance"] } #处理多值字段,term 查询是包含,而不是等于 POST movies/_search { "query": { "constant_score": { "filter": { "term": { "genre.keyword": "Comedy" } } } } } #字符类型 terms POST products/_search { "query": { "constant_score": { "filter": { "terms": { "productID.keyword": [ "QQPX-R-3956-#aD8", "JODL-X-1937-#pV7" ] } } } } } POST products/_search { "profile": "true", "explain": true, "query": { "match": { "price": 30 } } } POST products/_search { "profile": "true", "explain": true, "query": { "term": { "date": "2019-01-01" } } } POST products/_search { "profile": "true", "explain": true, "query": { "match": { "date": "2019-01-01" } } } POST products/_search { "profile": "true", "explain": true, "query": { "constant_score": { "filter": { "term": { "productID.keyword": "XHDK-A-1293-#fJ3" } } } } } POST products/_search { "profile": "true", "explain": true, "query": { "term": { "productID.keyword": "XHDK-A-1293-#fJ3" } } } #对布尔数值 POST products/_search { "query": { "constant_score": { "filter": { "term": { "avaliable": "false" } } } } } POST products/_search { "query": { "term": { "avaliable": { "value": "false" } } } } POST products/_search { "profile": "true", "explain": true, "query": { "term": { "price": { "value": "20" } } } } POST products/_search { "profile": "true", "explain": true, "query": { "match": { "price": "20" } } } } POST products/_search { "query": { "constant_score": { "filter": { "bool": { "must_not": { "exists": { "field": "date" } } } } } } }
12、搜索的相关性算分
PUT testscore { "settings": { "number_of_shards": 1 }, "mappings": { "properties": { "content": { "type": "text" } } } } PUT testscore/_bulk { "index": { "_id": 1 }} { "content":"we use Elasticsearch to power the search" } { "index": { "_id": 2 }} { "content":"we like elasticsearch" } { "index": { "_id": 3 }} { "content":"The scoring of documents is caculated by the scoring formula" } { "index": { "_id": 4 }} { "content":"you know, for search" } POST /testscore/_search { //"explain": true, "query": { "match": { "content":"you" //"content": "elasticsearch" //"content":"the" //"content": "the elasticsearch" } } } POST testscore/_search { "query": { "boosting" : { "positive" : { "term" : { "content" : "elasticsearch" } }, "negative" : { "term" : { "content" : "like" } }, "negative_boost" : 0.2 } } } POST tmdb/_search { "_source": ["title","overview"], "query": { "more_like_this": { "fields": [ "title^10","overview" ], "like": [{"_id":"14191"}], "min_term_freq": 1, "max_query_terms": 12 } } }
13、Query & Filtering 与多字符串多字段查询
POST /products/_bulk { "index": { "_id": 1 }} { "price" : 10,"avaliable":true,"date":"2018-01-01", "productID" : "XHDK-A-1293-#fJ3" } { "index": { "_id": 2 }} { "price" : 20,"avaliable":true,"date":"2019-01-01", "productID" : "KDKE-B-9947-#kL5" } { "index": { "_id": 3 }} { "price" : 30,"avaliable":true, "productID" : "JODL-X-1937-#pV7" } { "index": { "_id": 4 }} { "price" : 30,"avaliable":false, "productID" : "QQPX-R-3956-#aD8" } #基本语法 POST /products/_search { "query": { "bool" : { "must" : { "term" : { "price" : "30" } }, "filter": { "term" : { "avaliable" : "true" } }, "must_not" : { "range" : { "price" : { "lte" : 10 } } }, "should" : [ { "term" : { "productID.keyword" : "JODL-X-1937-#pV7" } }, { "term" : { "productID.keyword" : "XHDK-A-1293-#fJ3" } } ], "minimum_should_match" :1 } } } #改变数据模型,增加字段。解决数组包含而不是精确匹配的问题 POST /newmovies/_bulk { "index": { "_id": 1 }} { "title" : "Father of the Bridge Part II","year":1995, "genre":"Comedy","genre_count":1 } { "index": { "_id": 2 }} { "title" : "Dave","year":1993,"genre":["Comedy","Romance"],"genre_count":2 } #must,有算分 POST /newmovies/_search { "query": { "bool": { "must": [ {"term": {"genre.keyword": {"value": "Comedy"}}}, {"term": {"genre_count": {"value": 1}}} ] } } } #Filter。不参与算分,结果的score是0 POST /newmovies/_search { "query": { "bool": { "filter": [ {"term": {"genre.keyword": {"value": "Comedy"}}}, {"term": {"genre_count": {"value": 1}}} ] } } } #Filtering Context POST _search { "query": { "bool" : { "filter": { "term" : { "avaliable" : "true" } }, "must_not" : { "range" : { "price" : { "lte" : 10 } } } } } } #Query Context POST /products/_bulk { "index": { "_id": 1 }} { "price" : 10,"avaliable":true,"date":"2018-01-01", "productID" : "XHDK-A-1293-#fJ3" } { "index": { "_id": 2 }} { "price" : 20,"avaliable":true,"date":"2019-01-01", "productID" : "KDKE-B-9947-#kL5" } { "index": { "_id": 3 }} { "price" : 30,"avaliable":true, "productID" : "JODL-X-1937-#pV7" } { "index": { "_id": 4 }} { "price" : 30,"avaliable":false, "productID" : "QQPX-R-3956-#aD8" } POST /products/_search { "query": { "bool": { "should": [ { "term": { "productID.keyword": { "value": "JODL-X-1937-#pV7"}} }, {"term": {"avaliable": {"value": true}} } ] } } } #嵌套,实现了 should not 逻辑 POST /products/_search { "query": { "bool": { "must": { "term": { "price": "30" } }, "should": [ { "bool": { "must_not": { "term": { "avaliable": "false" } } } } ], "minimum_should_match": 1 } } } #Controll the Precision POST _search { "query": { "bool" : { "must" : { "term" : { "price" : "30" } }, "filter": { "term" : { "avaliable" : "true" } }, "must_not" : { "range" : { "price" : { "lte" : 10 } } }, "should" : [ { "term" : { "productID.keyword" : "JODL-X-1937-#pV7" } }, { "term" : { "productID.keyword" : "XHDK-A-1293-#fJ3" } } ], "minimum_should_match" :2 } } } POST /animals/_search { "query": { "bool": { "should": [ { "term": { "text": "brown" }}, { "term": { "text": "red" }}, { "term": { "text": "quick" }}, { "term": { "text": "dog" }} ] } } } POST /animals/_search { "query": { "bool": { "should": [ { "term": { "text": "quick" }}, { "term": { "text": "dog" }}, { "bool":{ "should":[ { "term": { "text": "brown" }}, { "term": { "text": "brown" }}, ] } } ] } } } DELETE blogs POST /blogs/_bulk { "index": { "_id": 1 }} {"title":"Apple iPad", "content":"Apple iPad,Apple iPad" } { "index": { "_id": 2 }} {"title":"Apple iPad,Apple iPad", "content":"Apple iPad" } POST blogs/_search { "query": { "bool": { "should": [ {"match": { "title": { "query": "apple,ipad", "boost": 1.1 } }}, {"match": { "content": { "query": "apple,ipad", "boost": } }} ] } } } DELETE news POST /news/_bulk { "index": { "_id": 1 }} { "content":"Apple Mac" } { "index": { "_id": 2 }} { "content":"Apple iPad" } { "index": { "_id": 3 }} { "content":"Apple employee like Apple Pie and Apple Juice" } POST news/_search { "query": { "bool": { "must": { "match":{"content":"apple"} } } } } POST news/_search { "query": { "bool": { "must": { "match":{"content":"apple"} }, "must_not": { "match":{"content":"pie"} } } } } POST news/_search { "query": { "boosting": { "positive": { "match": { "content": "apple" } }, "negative": { "match": { "content": "pie" } }, "negative_boost": 0.5 } } }
14、单字符串多字段查询:Dis Max Query
PUT /blogs/_doc/1 { "title": "Quick brown rabbits", "body": "Brown rabbits are commonly seen." } PUT /blogs/_doc/2 { "title": "Keeping pets healthy", "body": "My quick brown fox eats rabbits on a regular basis." } POST /blogs/_search { "query": { "bool": { "should": [ { "match": { "title": "Brown fox" }}, { "match": { "body": "Brown fox" }} ] } } } POST blogs/_search { "query": { "dis_max": { "queries": [ { "match": { "title": "Quick pets" }}, { "match": { "body": "Quick pets" }} ] } } } POST blogs/_search { "query": { "dis_max": { "queries": [ { "match": { "title": "Quick pets" }}, { "match": { "body": "Quick pets" }} ], "tie_breaker": 0.2 } } }
15、单字符串多字段查询:Multi Match
POST blogs/_search { "query": { "dis_max": { "queries": [ { "match": { "title": "Quick pets" }}, { "match": { "body": "Quick pets" }} ], "tie_breaker": 0.2 } } } POST blogs/_search { "query": { "multi_match": { "type": "best_fields", "query": "Quick pets", "fields": ["title","body"], "tie_breaker": 0.2, "minimum_should_match": "20%" } } } POST books/_search { "multi_match": { "query": "Quick brown fox", "fields": "*_title" } } POST books/_search { "multi_match": { "query": "Quick brown fox", "fields": [ "*_title", "chapter_title^2" ] } } DELETE /titles PUT /titles { "settings": { "number_of_shards": 1 }, "mappings": { "my_type": { "properties": { "title": { "type": "string", "analyzer": "english", "fields": { "std": { "type": "string", "analyzer": "standard" } } } } } } } PUT /titles { "mappings": { "properties": { "title": { "type": "text", "analyzer": "english" } } } } POST titles/_bulk { "index": { "_id": 1 }} { "title": "My dog barks" } { "index": { "_id": 2 }} { "title": "I see a lot of barking dogs on the road " } GET titles/_search { "query": { "match": { "title": "barking dogs" } } } DELETE /titles PUT /titles { "mappings": { "properties": { "title": { "type": "text", "analyzer": "english", "fields": {"std": {"type": "text","analyzer": "standard"}} } } } } POST titles/_bulk { "index": { "_id": 1 }} { "title": "My dog barks" } { "index": { "_id": 2 }} { "title": "I see a lot of barking dogs on the road " } GET /titles/_search { "query": { "multi_match": { "query": "barking dogs", "type": "most_fields", "fields": [ "title", "title.std" ] } } } GET /titles/_search { "query": { "multi_match": { "query": "barking dogs", "type": "most_fields", "fields": [ "title^10", "title.std" ] } } }
16、多语言及中文分词与检索
#stop word DELETE my_index PUT /my_index/_doc/1 { "title": "I'm happy for this fox" } PUT /my_index/_doc/2 { "title": "I'm not happy about my fox problem" } POST my_index/_search { "query": { "match": { "title": "not happy fox" } } } #虽然通过使用 english (英语)分析器,使得匹配规则更加宽松,我们也因此提高了召回率,但却降低了精准匹配文档的能力。为了获得两方面的优势,我们可以使用multifields(多字段)对 title 字段建立两次索引: 一次使用 `english`(英语)分析器,另一次使用 `standard`(标准)分析器: DELETE my_index PUT /my_index { "mappings": { "blog": { "properties": { "title": { "type": "string", "analyzer": "english" } } } } } PUT /my_index { "mappings": { "blog": { "properties": { "title": { "type": "string", "fields": { "english": { "type": "string", "analyzer": "english" } } } } } } } PUT /my_index/blog/1 { "title": "I'm happy for this fox" } PUT /my_index/blog/2 { "title": "I'm not happy about my fox problem" } GET /_search { "query": { "multi_match": { "type": "most_fields", "query": "not happy foxes", "fields": [ "title", "title.english" ] } } } #安装插件 ./elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.1.0/elasticsearch-analysis-ik-7.1.0.zip #安装插件 bin/elasticsearch install https://github.com/KennFalcon/elasticsearch-analysis-hanlp/releases/download/v7.1.0/elasticsearch-analysis-hanlp-7.1.0.zip #ik_max_word #ik_smart #hanlp: hanlp默认分词 #hanlp_standard: 标准分词 #hanlp_index: 索引分词 #hanlp_nlp: NLP分词 #hanlp_n_short: N-最短路分词 #hanlp_dijkstra: 最短路分词 #hanlp_crf: CRF分词(在hanlp 1.6.6已开始废弃) #hanlp_speed: 极速词典分词 POST _analyze { "analyzer": "hanlp_standard", "text": ["剑桥分析公司多位高管对卧底记者说,他们确保了唐纳德·特朗普在总统大选中获胜"] } #Pinyin PUT /artists/ { "settings" : { "analysis" : { "analyzer" : { "user_name_analyzer" : { "tokenizer" : "whitespace", "filter" : "pinyin_first_letter_and_full_pinyin_filter" } }, "filter" : { "pinyin_first_letter_and_full_pinyin_filter" : { "type" : "pinyin", "keep_first_letter" : true, "keep_full_pinyin" : false, "keep_none_chinese" : true, "keep_original" : false, "limit_first_letter_length" : 16, "lowercase" : true, "trim_whitespace" : true, "keep_none_chinese_in_first_letter" : true } } } } } GET /artists/_analyze { "text": ["刘德华 张学友 郭富城 黎明 四大天王"], "analyzer": "user_name_analyzer" }
还没有评论,来说两句吧...