全文搜索函数

编辑

在执行全文搜索时,即使用 MATCHQUERY 谓词时,应使用搜索函数。在所谓的搜索上下文之外,这些函数将返回默认值,例如 0NULL

Elasticsearch SQL 根据评分需求优化针对 Elasticsearch 执行的所有查询。在搜索请求上使用 track_scores 或使用禁用分数计算的 _doc 排序 时,Elasticsearch SQL 会指示 Elasticsearch 在不需要分数时不要计算分数。例如,每次在 SQL 查询中遇到 SCORE() 函数时,都会计算分数。

MATCH

编辑

概要

MATCH(
    field_exp,   
    constant_exp 
    [, options]) 

输入:

要匹配的字段

匹配文本

其他参数;可选

描述:Elasticsearch SQL 中可用的全文搜索选项,以谓词的形式提供,允许用户控制强大的 matchmulti_match Elasticsearch 查询。

第一个参数是要匹配的字段。如果仅接收一个值,则 Elasticsearch SQL 将使用 match 查询执行搜索

SELECT author, name FROM library WHERE MATCH(author, 'frank');

    author     |       name
---------------+-------------------
Frank Herbert  |Dune
Frank Herbert  |Dune Messiah
Frank Herbert  |Children of Dune
Frank Herbert  |God Emperor of Dune

但是,它也可以接收字段列表及其对应的可选 boost 值。在这种情况下,Elasticsearch SQL 将使用 multi_match 查询来匹配文档

SELECT author, name, SCORE() FROM library WHERE MATCH('author^2,name^5', 'frank dune');

    author     |       name        |    SCORE()
---------------+-------------------+---------------
Frank Herbert  |Dune               |11.443176
Frank Herbert  |Dune Messiah       |9.446629
Frank Herbert  |Children of Dune   |8.043278
Frank Herbert  |God Emperor of Dune|7.0029488

Elasticsearch 中的 multi_match 查询可以选择 按字段提升,使用 ^ 字符为搜索的字段提供优先权重(在评分方面)。在上面的示例中,在同时搜索 nameauthor 字段中的 frank dune 文本时,name 字段在最终分数中比 author 字段具有更大的权重。

以上两种选项都可以与 MATCH() 谓词的可选第三个参数结合使用,可以在其中为 matchmulti_match 查询指定其他配置参数(用分号 ; 分隔)。例如

SELECT author, name, SCORE() FROM library WHERE MATCH(name, 'to the star', 'operator=OR;fuzziness=AUTO:1,5;minimum_should_match=1')
ORDER BY SCORE() DESC LIMIT 2;

     author      |                name                |    SCORE()
-----------------+------------------------------------+---------------
Douglas Adams    |The Hitchhiker's Guide to the Galaxy|3.1756816
Peter F. Hamilton|Pandora's Star                      |3.0997515

单字段 MATCH() 变体(用于 match Elasticsearch 查询)允许的可选参数为:analyzerauto_generate_synonyms_phrase_querylenientfuzzinessfuzzy_transpositionsfuzzy_rewriteminimum_should_matchoperatormax_expansionsprefix_length

多字段 MATCH() 变体(用于 multi_match Elasticsearch 查询)允许的可选参数为:analyzerauto_generate_synonyms_phrase_querylenientfuzzinessfuzzy_transpositionsfuzzy_rewriteminimum_should_matchoperatormax_expansionsprefix_lengthsloptie_breakertype

QUERY

编辑

概要

QUERY(
    constant_exp 
    [, options]) 

输入:

查询文本

其他参数;可选

描述:与 MATCH 一样,QUERY 也是一个全文搜索谓词,允许用户控制 Elasticsearch 中的 query_string 查询。

第一个参数基本上是按原样传递给 query_string 查询的输入,这意味着 query_stringquery 字段接受的任何内容也可以在此处使用

SELECT author, name, SCORE() FROM library WHERE QUERY('name:dune');

    author     |       name        |    SCORE()
---------------+-------------------+---------------
Frank Herbert  |Dune               |2.2886353
Frank Herbert  |Dune Messiah       |1.8893257
Frank Herbert  |Children of Dune   |1.6086556
Frank Herbert  |God Emperor of Dune|1.4005898

一个更高级的示例,展示了 query_string 支持的更多功能,当然也可以通过 Elasticsearch SQL 实现

SELECT author, name, page_count, SCORE() FROM library WHERE QUERY('_exists_:"author" AND page_count:>200 AND (name:/star.*/ OR name:duna~)');

      author      |       name        |  page_count   |    SCORE()
------------------+-------------------+---------------+---------------
Frank Herbert     |Dune               |604            |3.7164764
Frank Herbert     |Dune Messiah       |331            |3.4169943
Frank Herbert     |Children of Dune   |408            |3.2064917
Frank Herbert     |God Emperor of Dune|454            |3.0504425
Peter F. Hamilton |Pandora's Star     |768            |3.0
Robert A. Heinlein|Starship Troopers  |335            |3.0

上面的查询使用 _exists_ 查询来选择在 author 字段中具有值的文档,使用 page_count 的范围查询,以及 name 字段的正则表达式和模糊查询。

如果需要自定义 query_string 公开的各种配置选项,可以使用第二个可选参数来完成。可以指定多个设置,并用分号 ; 分隔

SELECT author, name, SCORE() FROM library WHERE QUERY('dune god', 'default_operator=and;default_field=name');

    author     |       name        |    SCORE()
---------------+-------------------+---------------
Frank Herbert  |God Emperor of Dune|3.6984892

QUERY() 允许的可选参数为:allow_leading_wildcardanalyze_wildcardanalyzerauto_generate_synonyms_phrase_querydefault_fielddefault_operatorenable_position_incrementsescapefuzzinessfuzzy_max_expansionsfuzzy_prefix_lengthfuzzy_rewritefuzzy_transpositionslenientmax_determinized_statesminimum_should_matchphrase_sloprewritequote_analyzerquote_field_suffixtie_breakertime_zonetype

SCORE

编辑

概要

SCORE()

输入

输出double 数值

描述:返回给定输入与执行的查询的相关性。分数越高,数据越相关。

WHERE 子句中执行多个文本查询时,它们的分数将使用与 Elasticsearch 的 bool 查询相同的规则进行组合。

通常,SCORE 用于根据查询的相关性对结果进行排序

SELECT SCORE(), * FROM library WHERE MATCH(name, 'dune') ORDER BY SCORE() DESC;

    SCORE()    |    author     |       name        |  page_count   |    release_date
---------------+---------------+-------------------+---------------+--------------------
2.2886353      |Frank Herbert  |Dune               |604            |1965-06-01T00:00:00Z
1.8893257      |Frank Herbert  |Dune Messiah       |331            |1969-10-15T00:00:00Z
1.6086556      |Frank Herbert  |Children of Dune   |408            |1976-04-21T00:00:00Z
1.4005898      |Frank Herbert  |God Emperor of Dune|454            |1981-05-28T00:00:00Z

但是,在不按分数排序的情况下返回分数也是完全可以的

SELECT SCORE() AS score, name, release_date FROM library WHERE QUERY('dune') ORDER BY YEAR(release_date) DESC;

     score     |       name        |    release_date
---------------+-------------------+--------------------
1.4005898      |God Emperor of Dune|1981-05-28T00:00:00Z
1.6086556      |Children of Dune   |1976-04-21T00:00:00Z
1.8893257      |Dune Messiah       |1969-10-15T00:00:00Z
2.2886353      |Dune               |1965-06-01T00:00:00Z