elasticsearch6.5.4搜索(3.基本查询)

elasticsearch6.5.4搜索(3.基本查询)

1.词条查询

词条查询是Elasticsearch中的一个简单查询。它仅匹配在给定字段中含有该词条的文档,而 且是确切的、未经分析的词条。例如查询条件(查询将匹配title字段中含有crime一词的文档):

{
    "query" : {
        "term" : {
            "title" : "crime"
        } 
    }
}

除了想找的词条外,还可以在词条查询中包含加权属性,它影响给定词条的重要程度。为了修改前面的查询,给它一个10.0的加权,可以发送如下查询:

{
    "query" : {
        "term" : {
            "title" : {
				"value" : "crime",
            	"boost" : 10.0
			}
        } 
    }
}

2. 多词条查询

多词条查询允许匹配那些在内容中含有某些词条的文档。词条查询允许匹配单个未经分析的 词条,多词条查询可以用来匹配多个这样的词条。假设想得到所有在tags字段中含有novel或 book的文档。运行以下查询来达到目的。

{
    "query": {
        "terms": {
            "tags": ["novel", "book"]
        }
    }
}
{
     "query": {
         "bool": {
             "minimum_should_match": 0,
             "should": [{
                 "terms": {
                     "tags": ["novel", "book"]
                 }
             }]
         }
     }
 }

3.match_all查询

match_all查询是Elasticsearch中最简单的查询之一。它使我们能够匹配索引中的所有文件。
如果想得到索引中的所有文档,只需运行以下查询:

{
    "query":{
        "match_all" : {}
    }
}

也可以在查询中包含加权值,它将 给所有跟它匹配的文档。比如,在match_all查询中给
所有文档加上2.0的加权,可以发送以下查询:

{
    "query":{
        "match_all":{
           "boost" : 2.0
        }
    } 
}

4.match查询

match查询把query参数中的值拿出来,加以分析,然后构建相应的查询。使用match查询 时,Elasticsearch将对一个字段选择合适的分析器,所以可以确定,传给match查询的词条将被建 立索引时相同的分析器处理。请记住,match查询(以及将在稍后解释的multi_match查询)不支持Lucene查询语法。但是,它是完全符合搜索需求的一个查询处理器。最简单也是默认的match 查询如下所示:

{
    "query" : {
        "match" : {
            "title" : "crime and punishment"
        }
    }
}

5.multi_match查询

multi_match查询和match查询一样,不同的是它不是 对单个字段,而是可以通过 fields参数 对多个字段查询。当然,match查询中可以使用的所有参数同样可以在multi_ match查询中使用。所以,如果想修改match查询,让它 对title和otitle字段运行,那么 运行以下查询:

{
   "query": {
       "multi_match": {
           "query": "crime punishment",
           "fields": ["title", "otitle"]
       }
   }
}

5.query_string查询

相比其他可用的查询,query_string查询支持全部的Apache Lucene查询语法。它使用一个查询解析器把提供的文本构建成实际的查询:

{
	"query":{
		"query_string":{
			"query":"title:crim^10 +title:punishment -otitle:cat +author:(+Fyodor +dostoevsky)",
			"default_field":"title"
		}
	}
}

以上查询条件的含义是:得到在title字段中包含crime词条的文档,并且这些文档应该有10的加权。接下 来,我们希望文档在title字段中包含punishment,而在otitle字段中不包含cat。最后,告 诉Lucene我们只希望文档的author字段中包含Fyodor和dostoevsky词条。

6.simple_query_string查询

simple_query_string查询使用Lucene的最新查询解析器之一:SimpleQueryParser。 类似字符串查询,它接受Lucene查询语法;然而不同的是,simple_query_string查询在解析 错误时不会 出异常。它丢 查询无效的部分,执行其余部分,示例如下:

{
	"query":{
		"simple_query_string":{
			"query":"title:crime^10 +title:punishment -otitle:cat +author:(+Fyodor +dostoevsky)",
			"default_operator":"and"
		}
	}
}

7.标识符查询

标识符查询是一个简单的查询,仅用提供的标识符来过滤返回的文档。此查询 对内部的 _uid字段运行,所以它不需要启用_id字段。最简单的版本类似于下面的代码:

{
	"query":{
		"ids":{
			"values":["1","4","2","3"]
		}
	}
}

此查询只返回具有values数组中一个标识符的文档。也可以把标识符查询变得复杂一点,
限制文档为特定的类型。例如,只包括book类型的文档,发出以下查询:

8. 前缀查询

前缀查询在配置方面来说跟词条查询类似。前缀查询能让我们匹配这样的文档:它们的特定 字段以给定的前缀开始。例如,想找到所有title字段以cri开始的文档,可以运行以下查询:

{
	"query":{
		"prefix":{
			"title": "cri"
		}
	}
}

与词条查询类似,还可以在前缀查询中包含加权属性;这将影响到给定前缀的重要性。例如, 2 改变之前的查询,并给它增加3.0的加权,发出以下查询:

{
	"query":{
		"prefix":{
			"title":{
				"value":"cri",
				"boost":3.0
			}
		}
	}
}

9.more_like_this查询

more_like_this查询让我们能够得到与提供的文本类似的文档。Elasticsearch支持几个参数来定义more_like_this查询如何工作,如下所示。

  • fields:此参数定义应该执行查询的字段数组,默认值是_all字段
  • like:这是一个必需的参数,包含用来跟文档比较的文本。
  • min_term_freq:此参数定义了文档中词条的最 词频, 于此频率的词条将被忽略,默认值为2。
  • max_query_terms:此参数指定生成的查询中能包括的最大查询词条数,默认值为25。 值越大,精度越大,但性能也越 。
  • stop_words:此参数定义了一个单词的数组,当比较文档和查询时,这些单词将被忽略, 默认值为空数组。
  • min_doc_freq:此参数定义了包含某词条的文档的最小数目, 于此数目时,该词条将 被忽略,默认值为5,意味着一个词条至少应该出现在5个文档中,才不会被忽略。
  • max_doc_freq:此参数定义了包含某词条的文档的最大数目,高于此数目时,该词条将 被忽略,默认值为无限制。
{
	"query":{
		"more_like_this":{
			"fields":["title","otitle"],
			"like":"crime and punishment",
			"min_term_freq":1,
			"min_doc_freq":1,
			"max_query_terms":35,
			"stop_words":["book"]
		}
	}
}

10.fuzzy查询

fuzzy查询是模 查询中的第三种类型,它基于编辑 算法来匹配文档。编辑 的计算 基于我们提供的查询词条和被搜索文档。此查询很 用CPU资源,但当需要模 匹配时它很有用, 例如,当用户 写错误时。在我们的示例中,假设用户向搜索 中输入单词crme,而不是crime, 运行模 查询的最简单形式如下所示:

{
	"query":{
		"fuzzy":{
			"title":"crme"
		}
	}
}

查询结果:

{
    "took": 13,
    "timed_out": false,
    "_shards": {
        "total": 3,
        "successful": 3,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 1,
        "max_score": 0.4805432,
        "hits": [
            {
                "_index": "library",
                "_type": "book",
                "_id": "4",
                "_score": 0.4805432,
                "_source": {
                    "available": true,
                    "tags": [],
                    "author": "Fyodor Dostoevsky",
                    "otitle": "Преступлéние инаказáние",
                    "copies": 0,
                    "characters": [
                        "Raskolnikov",
                        "Sofia Semyonovna Marmeladova"
                    ],
                    "year": 1886,
                    "title": "Crime and Punishment"
                }
            }
        ]
    }
}

11. 配符查询

通配符查询允许我们在查询值中使用*和?等通配符。此外,通配符查询跟词条查询在内容方 面非常类似。可以发送一下查询,来匹配所有包含cr?me词条的文档,这里?表示任意字符:

{
	"query":{
		"wildcard":{
			"title":"cr?me"
		}
	}
}

12. 范围查询

范围查询使我们能够找到在某一字段值在某个范围里的文档,字段可以是数值型,也可以是 基于字符串的(将映射到一个不同的Apache Lucene查询)。范围查询只能 对单个字段,查询参 数应 装在字段名称中。范围查询支持以下参数。

  • gte:范围查询将匹配字段值大于或等于此参数值的文档。
  • gt:范围查询将匹配字段值大于此参数值的文档。
  • lte:范围查询将匹配字段值小于或等于此参数值的文档。
  • lt:范围查询将匹配字段值小于此参数值的文档。
    因此,举例来说,要找到year字段从1700到1900的所有图书,可以运行以下查询:
{
	"query":{
   	    "range":{
   		    "year":{
   			    "gte":1700,
   			    "lte":1900
   		    }
   	    }
   }
}

13. 正则表达式查询

通过正则表达式查询,可以使用正则表达式来查询文本。请记住,此类查询的性能取决于所 选的正则表达式。如果我们的正则表达式匹配许多词条,查询将很慢。一般规则是,正则表达式 4 匹配的词条数越高,查询越慢。

{
	"query" : {
   	    "regexp" : {
            "title" : {
                "value" : "cr.m[ae]",
                "boost" : 10.0
            }
        }
     }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值