03.full_text interval查询


full text查询就是基于分词的查询,有很多分类

intervals query intervals查询: 全文查询,可以对匹配项的顺序和接近度进行细粒度控制。
match query匹配查询: 用于执行全文查询的标准查询,包括模糊匹配和短语或接近查询。
match_bool_prefix查询: 创建一个布尔查询,将与每个词匹配的词查询作为词查询,但最后一个词除外,后者作为前缀查询匹配
match_phrase查询: 类似于匹配查询,但用于匹配精确短语或单词接近匹配。
match_phrase_prefix查询: 类似于match_phrase查询,但是对最后一个单词进行通配符搜索。
multi_match query多重匹配查询: 匹配查询的多字段版本。
common terms query 常用词查询: 一个更专业的查询,它对不常见的单词给予更多的偏爱。
query_string查询: 支持紧凑的Lucene查询字符串语法,允许您在单个查询字符串中指定AND | OR | NOT条件和多字段搜索。仅限于专业用户。
simple_query_string查询: 适用于直接向用户公开的query_string语法的更简单,更可靠的版本。

1. intervals query 简介

根据匹配项的顺序和接近程度返回文档。

intervals查询使用匹配规则,该规则由一小组定义构成。然后将这些规则应用于指定字段中的term。

这些定义产生的最小intervals序列跨越了文本主体中的各个术语。这些intervals可以由父源进一步组合和过滤。

2. 样例

下面的查询会返回有"my favorite food hot water"或者"my favorite food cold porridge " 的docment
但是"when it’s cold my favorite food is porridge" 的doc则不会被召回

PUT interval/_doc/1
{
"my_text" : "my favorite food hot water"
}

PUT interval/_doc/2
{
 "my_text" : "my favorite food cold porridge"
 }

PUT interval/_doc/3
{
  "my_text":"when it’s cold my favorite food is porridge"
}


POST _search
{
  "query": {
    "intervals" : {
      "my_text" : {  # 这里是你要进行interval query的field
        "all_of" : {
          "ordered" : true,
          "intervals" : [
            {
              "match" : {
                "query" : "my favorite food",
                "max_gaps" : 0,
                "ordered" : true
              }
            },
            {
              "any_of" : {
                "intervals" : [
                  { "match" : { "query" : "hot water" } },
                  { "match" : { "query" : "cold porridge" } }
                ]
              }
            }
          ]
        }
      }
    }
  }
}

上面的my_text对应的是一个field的name,然后my_text的value就是一个查询rule object,
这个rule object一共可以有四种类型

match
all_of
any_of
filter

3. match

match rule object的参数
query: (必需,字符串)希望在提供的中找到的文本。
max_gaps: (可选,整数)匹配项之间的最大位置数。除此以外的术语不视为匹配项。默认为-1。如果未指定或设置为-1,则对匹配没有宽度限制。如果设置为0,则这些术语必须彼此相邻。
ordered:(可选,布尔值)如果为true,则匹配词必须以其指定顺序出现。默认为false。
analyzer: (可选,字符串)分析器,用于分析查询中的术语。默认为顶级的分析器。
filter: (可选,intervals过滤器规则对象)可选intervals过滤器。
use_field: (可选,字符串)如果指定,则匹配该字段而不是顶级的intervals。使用该字段中的搜索分析器分析术语。这样,您就可以跨多个字段进行搜索,就好像它们都是同一字段一样。例如,您可以将相同的文本编入词干和未词干字段中,并在未词干的字段附近搜索词干标记。

4. all_of

all_of规则返回匹配其他规则组合的匹配项。

intervals:(必需,规则对象数组)要组合的规则数组。所有规则都必须在文档中产生匹配项,以使整个源匹配。
max_gaps: (可选,整数)匹配项之间的最大位置数。由规则产生的intervals比此intervals更远将不视为匹配。默认为-1。如果未指定或设置为-1,则对匹配没有宽度限制。如果设置为0,则这些术语必须彼此相邻。
ordered: (可选,布尔值)如果为true,则规则所产生的intervals应按其指定的顺序显示。默认为false。
filter: (可选,intervals过滤器规则对象)用于过滤返回的intervals的规则。

5. any_of

any_of规则返回其任何子规则产生的interval。

intervals:(必需,规则对象数组)要匹配的规则数组。
filter: (可选,intervals过滤器规则对象)用于过滤返回的intervals的规则。

6. filter

过滤器规则基于查询返回intervals。有关示例,请参见过滤器示例。

after:(可选,查询对象)查询用于返回遵循过滤规则intervals的intervals。
before: (可选,查询对象)查询用于返回在过滤规则的intervals之前发生的intervals。
contains_by: (可选,查询对象)用于返回过滤规则中某个intervals所包含的intervals的查询。
containing:(可选,查询对象)用于返回包含来自过滤规则的intervals的intervals的查询。
not_contained_by: (可选,查询对象)查询用于返回过滤规则中某个intervals未包含的intervals。
not_contain:(可选,查询对象)用于返回不包含来自过滤规则的intervals的intervals的查询。
not_overlapping: (可选,查询对象)查询用于返回与过滤规则的intervals不重叠的intervals。
overlapping: (可选,查询对象)查询用于返回与过滤规则中的intervals重叠的intervals。
script: (可选,脚本对象)用于返回匹配文档的脚本。该脚本必须返回布尔值true或false。有关示例,请参见脚本过滤器。

样例

POST _search
{
  "query": {
    "intervals" : {
      "my_text" : {
        "match" : {
          "query" : "hot porridge",
          "max_gaps" : 10,
          "filter" : {
            "not_containing" : {
              "match" : {
                "query" : "salty"
              }
            }
          }
        }
      }
    }
  }
}

POST _search
{
  "query": {
    "intervals" : {
      "my_text" : {
        "match" : {
          "query" : "hot porridge",
          "filter" : {
            "script" : {
              "source" : "interval.start > 10 && interval.end < 20 && interval.gaps == 0"
            }
          }
        }
      }
    }
  }
}

intervals查询始终将intervals最小化,以确保查询可以线性运行。有时这可能会导致令人惊讶的结果,尤其是在使用max_gaps限制或过滤器时。例如,采用以下查询,
则拥有"hot porridge is salty porridge" 的字段的doc不会被返回,因为contained_by只会返回他命中的那一部分,在这里,只会命中"hot porridge is salty porridge" 前面两个单词,那么salt就没有办法匹配了

POST _search
{
  "query": {
    "intervals" : {
      "my_text" : {
        "match" : {
          "query" : "salty",
          "filter" : {
            "contained_by" : {
              "match" : {
                "query" : "hot porridge"
              }
            }
          }
        }
      }
    }
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
优化以上代码可以考虑以下几点: 1. 子查询替换为临时表:将子查询部分的代码提取出来,创建一个临时表,然后在主查询中引用该临时表,这样可以提高查询效率。 ```sql CREATE TEMPORARY TABLE temp_table AS SELECT a.biz_date, a.county_name, a.depart_name, a.person_uuid, a.cust_code, a.cust_name, a.terminal_level_name, a.data_gather_type_name, a.sc_type_name, a.sc_score, b.sc_type_name AS sc_type_name_old, b.sc_score AS sc_score_old, a.sc_score - b.sc_score AS up FROM ads_yh_yx_sctwo a LEFT JOIN ads_yh_yx_sctwo b ON a.cust_code = b.cust_code AND b.biz_date = DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 2 DAY), '%Y%m%d') AND b.person_uuid = '00000000001389361632876_5304_371' WHERE a.biz_date = DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 DAY), '%Y%m%d') AND a.person_uuid = '00000000001389361632876_5304_371' AND a.sc_type_name <> b.sc_type_name AND (a.sc_score - b.sc_score) <> 0; ``` 2. 使用索引:对于频繁使用的列,可以考虑创建索引以提高查询效率。根据实际情况,在 `ads_yh_yx_sctwo` 表的 `biz_date`、`person_uuid` 和 `cust_code` 列上创建索引。 ```sql CREATE INDEX idx_biz_date ON ads_yh_yx_sctwo (biz_date); CREATE INDEX idx_person_uuid ON ads_yh_yx_sctwo (person_uuid); CREATE INDEX idx_cust_code ON ads_yh_yx_sctwo (cust_code); ``` 3. 优化 JOIN 条件:根据实际情况,可以考虑调整 JOIN 的条件,使其更加精确,减少不必要的匹配。 4. 使用 EXPLAIN 分析查询计划:使用 `EXPLAIN` 命令可以帮助分析查询计划,找出潜在的性能问题,并进行相应优化。 以上是一些常见的优化方法,具体的优化策略需要根据实际情况和数据库结构进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值