全文查询会用查询字段的分词器对查询的文本进行分词生成查询, 本节来探索全文查询的其他特性。
下载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"
查看自动生成好的mapping:
当使用Full Text Query查询Recipes with pasta or spaghetti
时,其大体步骤如下:
首先对Recipes with pasta or spaghetti
分词,最终返回结果为 recipes, with, pasta, or, spaghetti
,然后分别去库中进行匹配,默认只要一个匹配,就认为匹配,但会加入一个匹配程度(关联度),用scoce分数表示。
从上面的行为中你可能发现,全文搜索默认使用 or
操作符, 其实它有一个operator
参数,表示操作类型,可选值为:Operator.OR
和 Operator.AND
。对查询字符串分词后会返回词根列表,OR只需一个满足及认为匹配,而AND则需要全部词根都能匹配,默认值为:Operator.OR
。
当我们使用AND操作符,以下搜索需要title中全部包含 recipes, with, pasta, or, spaghetti
关键字:
减少查询的关键字,匹配到结果:
与match query类似,但只是用来精确匹配的短语。 其主要工作流程:首先,Elasticsearch会使用分词器对全文本进行分词,返回一个一个的词根(顺序排列),然后同样使用分词器对查询字符串进行分析,返回一个一个的词根(具有顺序性)。如果能在全字段中能够精确找到与查询字符串通用的词根序列,则认为匹配,否则认为不匹配。
例如查询speghetti puttanesca
, 会有一条结果:
但查询puttanesca spaghetti
, 由于title中不满足两个单词的顺序排列,所以不会返回结果:
multi_match查询建立在match查询之上,允许多字段查询。
例如同时查询title
和description
中包含pasta
的记录: