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
}
}
}
}