Full text query

全文查询会用查询字段的分词器对查询的文本进行分词生成查询, 本节来探索全文查询的其他特性。

数据准备

下载recipe.json:

wget https://pingfan.s3.amazonaws.com/files/recipe.json

使用Bulk API导入到recipe索引:

curl -k -XPOST https://{elasticsearch-ip}:9200/recipe/_bulk \
-H "Content-Type: application/x-ndjson" \
-u "elastic:{elasticsearch-password}" \
--data-binary "@recipe.json"

image-20220725085437173

查看自动生成好的mapping:

image-20220725085707889

逻辑操作类型

当使用Full Text Query查询Recipes with pasta or spaghetti时,其大体步骤如下: 首先对Recipes with pasta or spaghetti分词,最终返回结果为 recipes, with, pasta, or, spaghetti,然后分别去库中进行匹配,默认只要一个匹配,就认为匹配,但会加入一个匹配程度(关联度),用scoce分数表示。

image-20220726065825578

从上面的行为中你可能发现,全文搜索默认使用 or 操作符, 其实它有一个operator参数,表示操作类型,可选值为:Operator.OROperator.AND。对查询字符串分词后会返回词根列表,OR只需一个满足及认为匹配,而AND则需要全部词根都能匹配,默认值为:Operator.OR

当我们使用AND操作符,以下搜索需要title中全部包含 recipes, with, pasta, or, spaghetti关键字:

image-20220726070314664

减少查询的关键字,匹配到结果:

image-20220726070404538

match phrases查询

与match query类似,但只是用来精确匹配的短语。 其主要工作流程:首先,Elasticsearch会使用分词器对全文本进行分词,返回一个一个的词根(顺序排列),然后同样使用分词器对查询字符串进行分析,返回一个一个的词根(具有顺序性)。如果能在全字段中能够精确找到与查询字符串通用的词根序列,则认为匹配,否则认为不匹配。

例如查询speghetti puttanesca, 会有一条结果:

image-20220726070720904

但查询puttanesca spaghetti, 由于title中不满足两个单词的顺序排列,所以不会返回结果:

image-20220726070740866

multi-match 查询

multi_match查询建立在match查询之上,允许多字段查询。

例如同时查询titledescription中包含pasta的记录:

image-20220726071047346