字段类查询主要包含以下2类:
1.term结构化字段查询,匹配一个值,且输入的值不会被分词器分词。
比如查询条件是:
{
"query":{
"term":{
"foo": "hello world"
}
}
}
那么只有在字段中存储了“hello world”的数据才会被返回,如果在存储时,使用了分词,原有的文本“I say hello world”会被分词进行存储,不会存在“hello world”这整个词,那么不会返回任何值。
但是如果使用“hello”作为查询条件,则只要数据中包含“hello”的数据都会被返回,分词对这个查询影响较大。
2.match_phase习语匹配,查询确切的phase,在对查询字段定义了分词器的情况下,会使用分词器对输入进行分词,然后返回满足下述两个条件的document:
1.match_phase中的所有term都出现在待查询字段之中
2.待查询字段之中的所有term都必须和match_phase具有相同的顺序
{ "foo":"I just said hello world" }
{ "foo":"Hello world" }
{ "foo":"World Hello" }
3.使用match_phase:
{
"query": {
"match_phrase": {
"foo": "Hello World"
}
}
}
会返回前两条文档。
注:slop 参数
通过 slop 参数可以控制单词间的间隔,如设置"slop": “2”,则表示单词间可以隔2个单词。
3.match模糊匹配,先对输入进行分词,对分词后的结果进行查询,文档只要包含match查询条件的一部分就会被返回。
4.query_string语法查询,同match_phase的相同点在于,输入的查询条件会被分词,但是不同之处在与文档中的数据可以不用和query_string中的查询条件有相同的顺序。
5.match之 operator参数
通过 operator 参数可以 控制 单词间的匹配关系,可选项是 or 和 and。
因此,当你希望match 实现 分词 但词语必须都包含的情况时,可以修改此参数来达到目的,如下:
GET testindex/_search
{
"query": {
"match": {
"name": {
"query": "hello world",
"operator": "and"
}
}
}
}
6.match 之 minimum_should_match 参数
通过minimum_should_match 参数可以控制需要匹配的单词数。
例:
// 任意满足其中2个单词即可
GET testindex/_search
{
"query": {
"match": {
"name": {
"query": "i want to say hello",
"minimum_should_match": "2"
}
}
}
}
可以通过explain 参数来查看具体的计算方法,但需要主要以下几点:
例:
GET testindex/_search
{
"explain": true,
"query": {
"match": {
"name": "kate"
}
}
}
// 设置shards分片数
PUT testindex
{
"settings": {
"index": {
"number_of_shards": "1"
}
}
}
语法如下:
GET testindex/_search
{
"query": {
"constant_score": {
"filter": { // 只能有一个
"match": {
"name": "kate"
}
}
}
}
}
bool 查询可由一个或多个布尔子句组成,主要包含如下4类:
filter | 只过滤符合条件的文档,不计算相关性得分 |
---|---|
must | 文档必须符合 must中的所有条件,会影响相关性得分 |
must_not | 文档必须不符合 must_not 中的所有条件,不计算相关性得分 |
should | 文档可以符合 should 中的所有条件,会影响相关性得分 |
语法如下:
GET testindex/_search
{
"query": {
"bool": {
"filter": [
{
"term": {
"name": "kate"
}
}
]
}
}
}
should 使用分为2种情况:
(1)bool 查询只包含 should,不包含must查询
此时,文档满足一个条件即可。
可通过minimum_should_match 来控制满足条件的个数。
(2)bool 查询同时包含 should 和 must查询
此时,文档必须满足must 的条件,should可以不满足,但是如果满足了should 条件,会增加相关性得分。
1、_count
统计文档数目
2、_source
过滤返回结果中 _source 中的字段,主要有以下几种用法
用法一:
GET testindex/_search?_source=name
用法二:
GET testindex/_search
{
"_source": false
}
用法三:
GET testindex/_search
{
"_source": ["name","age"]
}
用法四:
GET testindex/_search
{
"_source": {
"includes": "name",
"excludes": "age"
}
}
1、查询字段是否存在
GET testindex/_search
{
"query": {
"exists": { // 关键字
"field": "price" // price 字段
}
}
}
2、查询空字符串的字段(字段存在,内容是空字符串)
// 利用 wildcardQuery 和 mustNot搭配,可以查到空字符串内容的值
BoolQueryBuilder mustNot = QueryBuilders.boolQuery()
.must(QueryBuilders.existsQuery("group_name"))
.mustNot(QueryBuilders.wildcardQuery("group_name", "*"));