ElasticSearch 6.x 学习笔记:17.词项查询

2022-05-06 19:14:33 浏览数 (1)

17.1 词项查询介绍

词项查询官网: https://www.elastic.co/guide/en/elasticsearch/reference/6.1/term-level-queries.html

While the full text queries will analyze the query string before executing, the term-level queries operate on the exact terms that are stored in the inverted index. 全文查询将在执行之前分析查询字符串,但词项级别查询将按照存储在倒排索引中的词项进行精确操作。

These queries are usually used for structured data like numbers, dates, and enums, rather than full text fields. Alternatively, they allow you to craft low-level queries, foregoing the analysis process. 这些查询通常用于数字,日期和枚举等结构化数据,而不是全文本字段。 或者,它们允许您制作低级查询,并在分析过程之前进行。

17.2 term查询

Find documents which contain the exact term specified in the field specified.

term查询用于词项搜索,已经在《7.3 文档搜索》和《15.检索入门》章节介绍,这里不再累述。

17.3 terms查询

Find documents which contain any of the exact terms specified in the field specified. Filters documents that have fields that match any of the provided terms (not analyzed). terms查询可以用来查询文档中包含任一个给定多词项的文档

同样,terms查询已经在《7.3 文档搜索》和《15.检索入门》章节介绍,这里不再累述。

17.4 terms_set查询

https://www.elastic.co/guide/en/elasticsearch/reference/6.1/query-dsl-terms-set-query.html

terms_set查询是一个新的查询,它的语法将来可能会改变。

Find documents which match with one or more of the specified terms. The number of terms that must match depend on the specified minimum should match field or script. 查找与一个或多个指定词项匹配的文档,其中必须匹配的术语数量取决于指定的最小值,应匹配字段或脚本。

代码语言:javascript复制
PUT my-index
{
    "mappings": {
        "doc": {
            "properties": {
                "required_matches": {
                    "type": "long"
                }
            }
        }
    }
}

PUT /my-index/doc/1?refresh
{
    "codes": ["ghi", "jkl"],
    "required_matches": 2
}

PUT /my-index/doc/2?refresh
{
    "codes": ["def", "ghi"],
    "required_matches": 2
}

最小值匹配的字段

代码语言:javascript复制
GET /my-index/_search
{
    "query": {
        "terms_set": {
            "codes" : {
                "terms" : ["abc", "def", "ghi"],
                "minimum_should_match_field": "required_matches"
            }
        }
    }
}

查询结果

代码语言:javascript复制
{
  "took": 66,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.5753642,
    "hits": [
      {
        "_index": "my-index",
        "_type": "doc",
        "_id": "2",
        "_score": 0.5753642,
        "_source": {
          "codes": [
            "def",
            "ghi"
          ],
          "required_matches": 2
        }
      }
    ]
  }
}

An example that always limits the number of required terms to match to never become larger than the number of terms specified: 一个总是限制匹配条件数量永远不会超过指定词项数量的例子如下,其中params.num_terms参数在脚本中可用,以指示已指定的词项数。

代码语言:javascript复制
GET /my-index/_search
{
    "query": {
        "terms_set": {
            "codes" : {
                "terms" : ["abc", "def", "ghi"],
                "minimum_should_match_script": {
                   "source": "Math.min(params.num_terms, doc['required_matches'].value)"
                }
            }
        }
    }
}
代码语言:javascript复制
{
  "took": 282,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.5753642,
    "hits": [
      {
        "_index": "my-index",
        "_type": "doc",
        "_id": "2",
        "_score": 0.5753642,
        "_source": {
          "codes": [
            "def",
            "ghi"
          ],
          "required_matches": 2
        }
      }
    ]
  }
}

17.5 range查询

https://www.elastic.co/guide/en/elasticsearch/reference/6.1/query-dsl-range-query.html

range查询用于匹配数值型、日期型或字符串型字段在某一范围内的文档。

【例子】搜索age字段在10到20的所有文档

代码语言:javascript复制
DELETE my-index

PUT my-index

PUT my-index/doc/1
{"age":12}

PUT my-index/doc/2
{"age":18}

PUT my-index/doc/3
{"age":21}

GET _search
{
    "query": {
        "range" : {
            "age" : {
                "gte" : 10,
                "lte" : 20,
                "boost" : 2.0
            }
        }
    }
}
代码语言:javascript复制
{
  "took": 24,
  "timed_out": false,
  "_shards": {
    "total": 55,
    "successful": 55,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 2,
    "hits": [
      {
        "_index": "my-index",
        "_type": "doc",
        "_id": "2",
        "_score": 2,
        "_source": {
          "age": 18
        }
      },
      {
        "_index": "my-index",
        "_type": "doc",
        "_id": "1",
        "_score": 2,
        "_source": {
          "age": 12
        }
      }
    ]
  }
}

【例子】日期范围查询

代码语言:javascript复制
GET website/_search
{
    "query": {
        "range" : {
            "postdate" : {
                "gte" : "2017-01-01",
                "lte" :  "2017-12-31",
                "format": "yyyy-MM-dd"
            }
        }
    }
}
代码语言:javascript复制
{
  "took": 6,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
      {
        "_index": "website",
        "_type": "blog",
        "_id": "8",
        "_score": 1,
        "_source": {
          "title": "es高亮",
          "author": "程裕强",
          "postdate": "2017-01-03",
          "abstract": "Elasticsearch查询关键字高亮",
          "url": "http://url/53991802"
        }
      }
    ]
  }
}

17.5 exists查询

https://www.elastic.co/guide/en/elasticsearch/reference/6.1/query-dsl-exists-query.html

Returns documents that have at least one non-null value in the original field 返回原始字段中至少包含一个非空值的文档

代码语言:javascript复制
PUT my-index/doc/1
{ "user": "jane" }

PUT my-index/doc/2
{ "user": "" } 

PUT my-index/doc/3
{ "user": [] }

PUT my-index/doc/4
{ "user": ["jane", null ] }

PUT my-index/doc/5
{ "age": 28 }

GET /_search
{
    "query": {
        "exists" : { "field" : "user" }
    }
}

匹配结果

代码语言:javascript复制
{
  "took": 18,
  "timed_out": false,
  "_shards": {
    "total": 55,
    "successful": 55,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": 1,
    "hits": [
      {
        "_index": "my-index",
        "_type": "doc",
        "_id": "2",
        "_score": 1,
        "_source": {
          "user": ""
        }
      },
      {
        "_index": "my-index",
        "_type": "doc",
        "_id": "4",
        "_score": 1,
        "_source": {
          "user": [
            "jane",
            null
          ]
        }
      },
      {
        "_index": "my-index",
        "_type": "doc",
        "_id": "1",
        "_score": 1,
        "_source": {
          "user": "jane"
        }
      }
    ]
  }
}

说明: 可以匹配的查询

  • “user”: “” ,有user字段,值非空(空字符串)
  • “user”: “jane”,有user字段,值非空
  • “user”: [“jane”,null],有user字段,至少有一个值非空

不能匹配的文档

  • “user”: [],有user字段,值空
  • “age”: 28,没有user字段

17.6 prefix查询

https://www.elastic.co/guide/en/elasticsearch/reference/6.1/query-dsl-prefix-query.html 【例子】查询以ki开头的用户

代码语言:javascript复制
GET /_search
{ "query": {
    "prefix" : { "user" : "ki" }
  }
}
代码语言:javascript复制
{
  "took": 37,
  "timed_out": false,
  "_shards": {
    "total": 55,
    "successful": 55,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 0,
    "max_score": null,
    "hits": []
  }
}

【例子】查询以ja开头的用户

代码语言:javascript复制
GET /_search
{ "query": {
    "prefix" : { "user" : "ja" }
  }
}
代码语言:javascript复制
{
  "took": 50,
  "timed_out": false,
  "_shards": {
    "total": 55,
    "successful": 55,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 1,
    "hits": [
      {
        "_index": "my-index",
        "_type": "doc",
        "_id": "4",
        "_score": 1,
        "_source": {
          "user": [
            "jane",
            null
          ]
        }
      },
      {
        "_index": "my-index",
        "_type": "doc",
        "_id": "1",
        "_score": 1,
        "_source": {
          "user": "jane"
        }
      }
    ]
  }
}

17.7 wildcard查询(通配符查询)

https://www.elastic.co/guide/en/elasticsearch/reference/6.1/query-dsl-wildcard-query.html

代码语言:javascript复制
GET website/_search
{
    "query": {
        "wildcard" : { "title" : "*yum*" }
    }
}
代码语言:javascript复制
{
  "took": 39,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
      {
        "_index": "website",
        "_type": "blog",
        "_id": "6",
        "_score": 1,
        "_source": {
          "title": "CentOS更换国内yum源",
          "author": "程裕强",
          "postdate": "2016-12-30",
          "abstract": "CentOS更换国内yum源",
          "url": "http://url.cn/53946911"
        }
      }
    ]
  }
}

17.8 regexp查询(正则表达式查询)

https://www.elastic.co/guide/en/elasticsearch/reference/6.1/query-dsl-regexp-query.html

The performance of a regexp query heavily depends on the regular expression chosen. Matching everything like .* is very slow as well as using lookaround regular expressions. If possible, you should try to use a long prefix before your regular expression starts. Wildcard matchers like .*? will mostly lower performance. 正则表达式查询的性能很大程度上取决于所选的正则表达式。 类似.*的匹配任何内容的正则表达式非常缓慢,并且使用了lookaround正则表达式。 如果可以的话,请尝试在正则表达式开始之前使用长前缀。 像.*? 这样的通配符匹配器大多会降低性能。

Most regular expression engines allow you to match any part of a string. If you want the regexp pattern to start at the beginning of the string or finish at the end of the string, then you have to anchor it specifically, using ^ to indicate the beginning or to indicate the end. 大多数正则表达式引擎允许您匹配字符串的任何部分。 如果你想让正则表达式模式从字符串的开头开始,或者在字符串的末尾完成,那么你必须明确地定位它,使用^表示开始或表示结束。

元字符

语义

说明

例子

.

Match any character

The period “.” can be used to represent any character 匹配任何一个字符

ab.匹配abc、ab1

One-or-more

The plus sign “ ” can be used to repeat the preceding shortest pattern once or more times.加号“ ”可以用来重复上一个最短的模式一次或多次。

“aaabbb”匹配a b

*

Zero-or-more

The asterisk “*” can be used to match the preceding shortest pattern zero-or-more times.

“aaabbb”匹配a*b*

?

Zero-or-one

The question mark “?” makes the preceding shortest pattern optional. It matches zero or one times.

“aaabbb”匹配aaa?bbbb?

{m},{m,n}

Min-to-max

Curly brackets “{}” can be used to specify a minimum and (optionally) a maximum number of times the preceding shortest pattern can repeat.

“aaabbb”匹配a{3}b{3}和a{2,4}b{2,4}

()

Grouping

Parentheses “()” can be used to form sub-patterns.

“ababab”匹配(ab)

|

Alternation

The pipe symbol “|” acts as an OR operator.

“aabb”匹配aabb|bbaa

[]

Character classes

Ranges of potential characters may be represented as character classes by enclosing them in square brackets “[]”. A leading ^ negates the character class.

[abc]匹配 ‘a’ or ‘b’ or ‘c’

~

Complement

The shortest pattern that follows a tilde “~” is negated(否定).“ab~cd”的意思是:以a开头,后跟b,后面跟一个任意长度的字符串,但不是c,以d结尾

“abcdef”匹配ab~df或a~(cb)def,不匹配ab~cdef和a~(bc)def

<>

Interval间隔

The interval option enables the use of numeric ranges, enclosed by angle brackets “<>”.

“foo80”匹配foo<1-100>

&

Intersection

The ampersand “&” joins two patterns in a way that both of them have to match.

“aaabbb”匹配aaa. &. bbb

@

Any string

The at sign “@” matches any string in its entirety.

@&~(foo. )匹配除了以“foo”开头的字符串 “foo”

代码语言:javascript复制
GET website/_search
{
    "query": {
        "regexp":{
            "title": "gc.*"
        }
    }
}
代码语言:javascript复制
{
  "took": 20,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
      {
        "_index": "website",
        "_type": "blog",
        "_id": "3",
        "_score": 1,
        "_source": {
          "title": "CentOS升级gcc",
          "author": "程裕强",
          "postdate": "2016-12-25",
          "abstract": "CentOS升级gcc",
          "url": "http://url.cn/53868915"
        }
      }
    ]
  }
}

17.9 fuzzy查询(模糊查询)

https://www.elastic.co/guide/en/elasticsearch/reference/6.1/query-dsl-fuzzy-query.html

代码语言:javascript复制
GET website/_search
{
    "query": {
        "fuzzy":{
            "title": "vmwere"
        }
    }
}
代码语言:javascript复制
{
  "took": 22,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.81735766,
    "hits": [
      {
        "_index": "website",
        "_type": "blog",
        "_id": "4",
        "_score": 0.81735766,
        "_source": {
          "title": "vmware复制虚拟机",
          "author": "程裕强",
          "postdate": "2016-12-29",
          "abstract": "vmware复制虚拟机",
          "url": "http://url.cn/53946664"
        }
      }
    ]
  }
}

17.9 type查询

代码语言:javascript复制
GET /_search
{
    "query": {
        "type" : {
            "value" : "my_type"
        }
    }
}
代码语言:javascript复制
{
  "took": 33,
  "timed_out": false,
  "_shards": {
    "total": 55,
    "successful": 55,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": 1,
    "hits": [
      {
        "_index": "my_index",
        "_type": "my_type",
        "_id": "2",
        "_score": 1,
        "_source": {
          "city": "York"
        }
      },
      {
        "_index": "index_1",
        "_type": "my_type",
        "_id": "1",
        "_score": 1,
        "_source": {
          "text": "Document in index 1"
        }
      },
      {
        "_index": "my_index",
        "_type": "my_type",
        "_id": "1",
        "_score": 1,
        "_source": {
          "city": "New York"
        }
      }
    ]
  }
}

17.9 ids查询

https://www.elastic.co/guide/en/elasticsearch/reference/6.1/query-dsl-ids-query.html

代码语言:javascript复制
GET /_search
{
    "query": {
        "ids" : {
            "type" : "blog",
            "values" : ["2", "3"]
        }
    }
}
代码语言:javascript复制
{
  "took": 15,
  "timed_out": false,
  "_shards": {
    "total": 55,
    "successful": 55,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 1,
    "hits": [
      {
        "_index": "website",
        "_type": "blog",
        "_id": "2",
        "_score": 1,
        "_source": {
          "title": "watchman源码编译",
          "author": "程裕强",
          "postdate": "2016-12-23",
          "abstract": "CentOS7.x的watchman源码编译",
          "url": "http://url.cn/53844169"
        }
      },
      {
        "_index": "website",
        "_type": "blog",
        "_id": "3",
        "_score": 1,
        "_source": {
          "title": "CentOS升级gcc",
          "author": "程裕强",
          "postdate": "2016-12-25",
          "abstract": "CentOS升级gcc",
          "url": "http://url.cn/53868915"
        }
      }
    ]
  }
}

0 人点赞