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查询不被解析,只有查询词和文档中的词精确匹配才会被搜索到。
{
"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查询会被解析查询语句(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用于词项搜索,之前已经解释过了
trems查询时trem查询的升级,可以用来查询文档中包含多个词的文档
{
"query":{
"terms":{
"title":["mockingbird","arabia"]//查询title字段中包含mockingbird或arabia的文档
}
}
}
prefix query查询用于查询某个字段中以给定前缀开始的文档
{
"query":{
"prefix":{
"title":"ki"//查询title字段中含有以ki为前缀的关键词的文档
}
}
}
type query用户查询具有指定类型的文档
{
"query":{
"type":{
"value":"movie" //查询类型为movie的文档
}
}
}
ids query用于查询具有指定id的文档
{
"query":{
"ids":{
"type":"movie",
"values":["1","2"] //查询id为1和2的movie类型文档
}
}
}
复合查询就是把一些简单查询组合在一起实现更复杂的查询需求。
bool query查询可以把任意多个简单查询组合在一起,使用must、should、must_not、filter选项来标识简单查询之间的逻辑,每个选项都可以出现0次或者多次,他们的含义如下
{
"query":{
"bool":{
"must":{
"match":{"title":"kill"}
},
"must_not":{
"match":{
"title":"bill"
}
}
}
}
}
//查询title中包含kill,且不包含bill的文档
参考书籍:《从Lucene Elasticsearch》