• 查询分析

查询的解释方式

查询的解释方式

"hello world" @title "example program"~5 @body python -(php|perl) @* code

此搜索的完整含义是:

  • 在文档的任何字段中相邻地查找单词 'hello' 和 'world';

  • 此外,文档还必须包含在 title 字段中的单词 'example' 和 'program',二者之间最多有 4 个单词;(例如,"example PHP program" 会匹配,而 "example script to introduce outside data into the correct context for your program" 不会匹配,因为这两个词之间有 5 个或更多单词)

  • 同时,文档的 body 字段中必须包含单词 'python',并排除 'php' 或 'perl';

  • 最后,文档的任何字段中都必须包含单词 'code'。

OR 操作符的优先级高于 AND,所以 "looking for cat | dog | mouse" 的意思是 "looking for (cat | dog | mouse)",而不是 "(looking for cat) | dog | mouse"。

为了理解查询的执行方式,Manticore Search 提供了查询性能分析工具,以查看由查询表达式生成的查询树。

在 SQL 中分析查询树

要启用 SQL 语句的全文查询性能分析,必须在执行所需查询之前激活它:

SET profiling =1;
SELECT * FROM test WHERE MATCH('@title abc* @body hey');

执行查询后,可以使用 SHOW PLAN 命令查看查询树:

SHOW PLAN;

此命令将返回执行的查询结构。请记住,SET profiling、查询和 SHOW 必须在同一会话中执行。

在 HTTP JSON 中分析查询

使用 HTTP JSON 协议时,只需启用 "profile":true 即可在响应中获取全文查询树结构。

响应将包含一个 profile 对象,其中包含一个 query 成员。

query 属性持有转换后的全文查询树。每个节点由以下部分组成:

  • type: 节点类型,可以是 AND、OR、PHRASE、KEYWORD 等。

  • description: 表示此节点的查询子树的字符串(以 SHOW PLAN 格式显示)。

  • children: 子节点(如果有的话)。

  • max_field_pos: 字段内的最大位置。

关键词节点将额外包含以下内容:

  • word: 转换后的关键词。

  • querypos: 此关键词在查询中的位置。

  • excluded: 被查询排除的关键词。

  • expanded: 由前缀扩展添加的关键词。

  • field_start: 关键词必须出现在字段的开头。

  • field_end: 关键词必须出现在字段的末尾。

  • boost: 关键词的 IDF 将乘以此值以影响包含 IDF 的排名计算。

SQL:

Python

javascript

java

C#

TypeScript

Go

在某些情况下,由于扩展和其他转换,评估后的查询树可能与原始查询有显著差异。

SQL:

JSON:

PHP:

Python

javascript

java

C#

TypeScript

Go

不执行查询的情况下进行分析

SQL 语句 EXPLAIN QUERY 允许显示给定全文查询的执行树,而无需在表上实际执行搜索查询。

SQL:

EXPLAIN QUERY ... option format=dot 允许以层次结构的格式显示所提供的全文查询的执行树,适用于由现有工具(例如 https://dreampuf.github.io/GraphvizOnline)进行可视化。

EXPLAIN QUERY graphviz example

SQL:

查看匹配因子的值

在使用表达式排序器时,可以使用 PACKEDFACTORS() 函数显示计算出的因子值。

该函数返回:

  • 文档级因子的值(例如 bm25、field_mask、doc_word_count)

  • 生成命中的每个字段的列表(包括 lcs、hit_count、word_count、sum_idf、min_hit_pos 等)

  • 查询中每个关键词的 tf 和 idf 值列表

这些值可以用来理解为什么某些文档在搜索中得分较高或较低,或者用来优化现有的排名表达式。

示例:

最后更新于