Elasticsearch是一个实时分布式搜索和分析引擎。它让你以前所未有的速度处理大数据成为可能。
它用于全文搜索、结构化搜索、分析以及将这三者混合使用:
检索文档
这对于Elasticsearch来说非常简单。我们只要执行HTTP GET请求并指出文档的“地址”——索引、类型和ID既可。根据这三部分信息,我们就可以返回原始JSON文档
我们通过HTTP方法
GET
来检索文档,同样的,我们可以使用
DELETE
方法删除文档,使用
HEAD
方法检查某文档是否存在。如果想更新已存在的文档,我们只需再
PUT
一次。
简单搜索:
term:term查询搜索在指定字段中具有给定单词的文档
{
"from" : 9 , //我们希望查询结果能够从列表的第10个文档返回20个文档
"size" : 20 ,
" version": true, //返回版本号
"min_score" : 0.75, //我们可以基于最小分数过滤查询结果,要求分数超过最小分数的文档才会本匹配-->0.75
"fields" : ["field1", "field2"....] , //指定在结果中包含哪些字段
"partial_fields" : { //我们可以通过此字段控制如何从_source字段加载字段
"partial1" : {
"include" : [ "titl*" ],
"exclude" : [ "chara*" ]
}
},
"script_fields" : { //以correntYear为名字返回一个值,该值是文档的year字段的取值减去1800
"correntYear" : {
"script" : "doc['year'].value-1800"
}
},
"script_fields" : { //可以为script_fields传递参数
"correntYear" : {
"script" : "_source.year-paramYear",
"params" : {
"paramYear" : 1800
}
}
},
"query ": {
"term": {
"title" : "crime" //在title字段中搜索crime
}
}
}
基本查询:
1.term 查询 --匹配在给定字段有某个词项的文档
{
"query" : {
"term": {
"title": {
"value" : "your given field",
other fields..
}
}
}
2 terms 查询 --允许我们匹配包含某些词项的文档
{
"query" : { //查询在tags字段包含novel或者book的文档 minimum_match属性设置为1表示至少应匹配一个词项
"term": {
"tags" : [ "novel", "book"],
"minimum_match" : 1
}
}
}
3.match查询 --提取查询参数中给定的取值,分析这些值,并基于它们构建适当的查询
{
"query" : { //该查询会匹配在title字段中包含crime and 或punishment的所有文档
"match": {
"title" : "crime and punishment"
}
}
}
布尔match查询是一种分析给定文本,并基于其做布尔查询的查询,match_phrase 查询与布尔查询类似,不同之处在于对查询的文本分析后构建的是一个短语查询,而不是布尔表达式
最后一类match查询是match_phrase_prefix查询,它与match_phrase区别在于它允许前缀可以匹配查询文本的最后一个词项,它还有另外一个参数max_expansions,该参数指明最后一个词项可以扩展出多少个前缀
{
"query" : {
"match_phrase": {
"title" : {
"query": "crime and punishment",
"slop" : 1
}
}
}
}
4.multi_match查询 类似于match查询,不过她可以通过使用fields参数作用在多个字段上
{
"query" : { //使查询语句作用在title和otitle两个字段
"multi_match": {
"query": "crime and punishment",
"fields": ["title","otitle"]
}
}
}
5.query_string查询 支持Apache Luncene所有的查询语法
{
"query" : {
"query_string": {
"default_field": "title",
"query": "title:crime^10 +title:punishment -otitle:cat +authors:(+fyodor+dostoevsky)"
}
}
}
查询串解释:该查询中我们希望得到那些在title字段中存在crime词项的文档,并且这些文档的权重为10,然后,我们只希望得到那些在title字段中包含punishment词项并且在otitle字段中不包含cat词项的文档,最后 ,我们告诉Lucene我们只希望得到在author字段中存在fyodor和dostoevsky词项的文档
多字段上的query_string查询 需要提供fields参数来保存一个字段名称的数组 ElasticSearch有两种在多个字段上执行query_string查询的方法,默认是使用布尔查询来构造查询,还有一种就是使用DisMax查询
使用DisMax查询,需要添加use_dis_max属性并设置为true。
{
"query" : {
"query_string": {
"query": "crime punishment",
"fields": ["title","otitle"],
"use_dis_max": true
}
}
6.field查询 ---是query_string查询的简化版本
{
"query" : { //如果想要得到在title字段中必然包含crime词项,可以包含nothing词项,不包含let词项的所有文档
"field": {
"title": "+crime nothing -let"
}
}
}
7.ids查询 -- 一类简单的查询,它过滤返回的文档只包含其中指定标识符的文档
{
"query" : { // 该查询返回包含values数组中某一个标识符的文档,并且约束为只得到book类型的文档
"ids": {
"type": "book",
"values": ["10","11","12","13"]
}
}
}
8.prefix查询 -- 可以使我们找到某个字段以给定前缀开始的文档
{
"query" : { //想得到title字段以cri开始的所有文档
"prefix": {
"title" : "cri"
}
}
}
9.fuzzy_likes_this查询--得到与给定内容非常相似的所有文档
fuzzy_like_this_field查询,不指定查询作用的字段,而是将查询参数封装在字段名称中
{
"query" : { //在title和otitle字段进行fuzzy_likes_this查询,并得到与crime punishment相似的所有文档
"fuzzy_like_this": {
"fields": ["title", "otitle"],
"like_text": "crime punishment"
}
}
}
fuzzy模糊查询,通过计算给定词项与文档的编辑举例来得到结果,该类查询对cpu资源的消耗是非常昂贵了,但是对需要模糊匹配的场景比较有用。
10.match_all查询 --实现匹配所有文档
11.wildcard查询 --wildcard查询允许我们在要查询到的内容中使用通配符*和?
{
"query" : { //通过此查询来使用cr?me匹配所有文档
"wildcard": {
"title": "cr?me"
}
}
}
12.more_like_this查询得到与所提供本文相似的文档
more_like_this_field查询与more_like_this查询相似,不同之处在于前者只作用在单个字段上,也就是说它不支持fields属性,more_like_this_field查询不指定查询作用的位置,而是将查询参数封装在字段名称中
{
"query" : {
"more_like_this": {
"fields": [
"title","otitle"
],
"like_text": "crime and punishment",
"min_term_freq": 1,
"max_query_terms": 12
}
}
}
13.range查询--使得我们可以在某个范围内在数值型字段和字符串型字段上查找文档,range查询只作用在单个字段上,并且查询的参数封装在字段的名称中
{
"query" : { //例如想要找到在year字段上查找范围在10-20之间的信息
"range": {
"year: {
"gte": 10,
"lte": 20
}
}
}
}
过滤查询结果
1.range过滤器--允许我们将搜索范围限制在字段取值在给定界限内的文档
2.exists过滤器--只选择那些有指定字段的文档
3.missing过滤器--与exists正好相反
4.script过滤器--使用一个计算得到的值来过滤文档
5.type过滤器--返回符合指定类型的所有文档
6.limit过滤器--用来限制给定查询每个分片返回的文档数目
7.ids过滤器--适合需要过滤某些具体文档的场景
8.bool、and、or、not过滤器
复合查询
1.bool查询--使用should、must、must_not进行条件筛选
例如:我们想要得到在title字段中含有crime词项的所有文档,另外这些文档的year字段可以在也可以不在1990年至2000年的范围内,并且在otitle字段中一定不包含nothing词项
{
"query" : {
"bool": {
"must": [
{
"term": "crime"
}
],
"should": [
{
"range": {
"year" : {
"from" : 1900,
"to" : 2000
}
}
}
],
"must_not": [
{
"term": {
"otilte": "nothing"
}
}
]
}
}
}
2.boosting查询--用于将两个查询封装在一起,并降低其中一个查询所返回文档的分值
该查询需要定义三个部分:positive部分,其中的查询返回文档的分值不变,negative部分,其中的查询返回的文档的分值将被降低,negative_boost部分,指明用于降低negative中查询分值的权值
3.constant_score查询--用于另一个查询,被封装查询返回的每个文档都将得到一个恒定的分值
4.indices查询--当需要在多个索引上执行一个查询时,该功能非常有用。
5.custom_filters_score查询--该查询允许我们封装一个查询和若干个过滤器。如果被封装查询返回的文档匹配上某个过滤器,我们就可以用某个权值或或预定义的脚本改变文档的分值。
6.custom_boost_factor查询--该查询允许我们封装另外一个查询,并将该查询返回的文档的分数值乘以一个指定的因子
7.custom_score查询--该查询通过script为另一个查询定制分值
以上用例并没有通过程序运行去验证,仅供参考