Elastcsearch 常用搜索命令

Elastcsearch 常用搜索命令 Elasticsearch的核心功能是搜索,有了前面的基础,可以合理地把文档索引到Elasticsearch之中。
Elassticsearch RESTful 的查询语句要封装成JSON格式的对象,称之为DSL。
添加测试数据

curl -XPUT "http://localhost:9200/movies/movie/1" -d' { "title": "The Godfather", "director": "Francis Ford Coppola", "year": 1972, "genres": ["Crime", "Drama"] }'curl -XPUT "http://localhost:9200/movies/movie/2" -d' { "title": "Lawrence of Arabia", "director": "David Lean", "year": 1962, "genres": ["Adventure", "Biography", "Drama"] }'curl -XPUT "http://localhost:9200/movies/movie/3" -d' { "title": "To Kill a Mockingbird", "director": "Robert Mulligan", "year": 1962, "genres": ["Crime", "Drama", "Mystery"] }'curl -XPUT "http://localhost:9200/movies/movie/4" -d' { "title": "Apocalypse Now", "director": "Francis Ford Coppola", "year": 1979, "genres": ["Drama", "War"] }'curl -XPUT "http://localhost:9200/movies/movie/5" -d' { "title": "Kill Bill: Vol. 1", "director": "Quentin Tarantino", "year": 2003, "genres": ["Action", "Crime", "Thriller"] }'curl -XPUT "http://localhost:9200/movies/movie/6" -d' { "title": "The Assassination of Jesse James by the Coward Robert Ford", "director": "Andrew Dominik", "year": 2007, "genres": ["Biography", "Crime", "Drama"] }'

搜索机制 搜索机制
搜索机制解决的是相关度问题,当用户输入一个查询,Elasticsearch通过排序模型计算文档和查询关键词之间的相关度,按照评分排序后返回最相关的文档给用户
查询所有文档 http://localhost:9200/movies/_search
{ "query":{ "match_all":{} } }

分页查询 在查询所有的基础上增加分页查询(这里注意,es保存数据时,全部保存成小写了,要忽略大小写才能查询包含大写的数据,或者全部用小写代替)
{ "from":0, "size":1, "query":{ "match_all":{} } }

只查询需要的字段
{ "from":0, "size":1, "_source":["title","director"],//这里指定我们需要查出的字段 "query":{ "match_all":{} } }

term查询指定字段中包含给定单词的文档 term查询用来查找指定字段中包含给定单词的文档,term查询不被解析,只有查询词和文档中的词精确匹配才会被搜索到。
{ "from":0, "size":1, "version":true, "_source":["title","director"], "query":{ "term":{"title":"kill"}//查询title字段中包含kill单词的文档 } }

高亮查询单词
{ "from":0, "size":1, "version":true, "_source":["title","director"], "query":{ "term":{"title":"kill"} }, "highlight": { "fields" : { "title" : {} } } }

全文检索
高级别的全文检索通常用于在全文字段上进行全文搜索,通过全文查询理解被查询字段是如何被索引和分析的,在执行之前将每个字段的分词词应用于查询字符串。
match 查询 match查询会被解析查询语句(term查询不会被解析),对查询语句进行分词,分词后查询语句中的任何一个词项被匹配,文档就会被搜索到。
http://localhost:9200/movies/_search
{ "query":{ "match":{"title":"kill"} } }

查询多个字段 multi_match是match的升级版,用于搜索多个字段
{ "query":{ "multi_match":{ "query":"kill", "fields":["title","director"]//查询title和director字段中包含kill的文档 } } }

词项搜索
全文搜索在执行查询之前会分析查询字符串,词项搜索时会对倒排索引中存储的词项进行精确操作。词项级别的查询通常用于结构化数据,如数字、日期和枚举类型
词项搜索 trem query用于词项搜索,之前已经解释过了
terms query trems查询时trem查询的升级,可以用来查询文档中包含多个词的文档
{ "query":{ "terms":{ "title":["mockingbird","arabia"]//查询title字段中包含mockingbird或arabia的文档 } } }

prefix query prefix query查询用于查询某个字段中以给定前缀开始的文档
{ "query":{ "prefix":{ "title":"ki"//查询title字段中含有以ki为前缀的关键词的文档 } } }

type query type query用户查询具有指定类型的文档
{ "query":{ "type":{ "value":"movie" //查询类型为movie的文档 } } }

ids query ids query用于查询具有指定id的文档
{ "query":{ "ids":{ "type":"movie", "values":["1","2"] //查询id为1和2的movie类型文档 } } }

复合查询
复合查询就是把一些简单查询组合在一起实现更复杂的查询需求。
bool query bool query查询可以把任意多个简单查询组合在一起,使用must、should、must_not、filter选项来标识简单查询之间的逻辑,每个选项都可以出现0次或者多次,他们的含义如下
  • must:文档必须匹配must选项下的查询条件,相当于逻辑运算的AND
  • should:文档可以匹配should选项下的查询条件也可以不匹配,相当于逻辑运算的OR
  • must_not:与must查询相反,匹配该查询条件的文档不会被返回
  • filter 和must一样,匹配filter选项下的查询条件才会被返回,但是filter不评分,只起到过滤作用
{ "query":{ "bool":{ "must":{ "match":{"title":"kill"} }, "must_not":{ "match":{ "title":"bill" } } } } } //查询title中包含kill,且不包含bill的文档

【Elastcsearch 常用搜索命令】参考书籍:《从Lucene Elasticsearch》

    推荐阅读