在我之前的文章 “Elasticsearch:fuzzy 搜索 (模糊搜索)”,我详细描述了模糊搜索。尽管那篇文章已经很详尽了,但是还是有 auto 这个配置没有完全覆盖到。在今天的文章中,我们来进一步对这个进行讲解一下。
Fuzziness 参数存在于某些查询中,使用它时,你将受益于根据术语的相似性来定位文档。 Elastic 使用 Levenshtein Edit Distance 算法将搜索词与文档词匹配。 这样,根据模糊配置,像术语 “schol” 这样的搜索将找到带有单词 “school” 的文档。
Fuzziness 参数可以配置为以下值:
- 0、1、2:允许对术语进行的编辑量。
- AUTO:根据输入项的大小,定义编辑次数。
Fuzines:0
等于 0 的编辑次数仅允许完全匹配。 在下面的示例中,只有完全匹配会返回结果,如果术语是 “bok”,则不会返回任何结果。
POST idx_fuzzy/_doc
{
"text": "I tore to the book page"
}
GET idx_fuzzy/_search
{
"query": {
"match": {
"text": {
"query": "book",
"fuzziness": "0"
}
}
}
}
Fuziness:1
当我们只允许 1 个编辑时,我们将在术语为 “sumer”(sumer->summer)时获得文档。 如果术语是 “samer”,查询将不会返回文档,因为最小编辑数将为 2。
POST idx_fuzzy/_doc
{
"text": "The city is more beautiful in summer"
}
GET idx_fuzzy/_search
{
"query": {
"match": {
"text": {
"query": "sumer",
"fuzziness": "1"
}
}
}
}
Fuziness:2
允许两次编辑,我们将能够在术语 “samer”(samer -> summer)时获得文档。
POST idx_fuzzy/_doc
{
"text": "The city is more beautiful in summer"
}
GET idx_fuzzy/_search
{
"query": {
"match": {
"text": {
"query": "samer",
"fuzziness": "2"
}
}
}
}
Fuzziness:AUTO
AUTO 设置允许你调整编辑和术语大小之间的关系。 默认情况下,该设置为 "AUTO:3,6",也就是说,大小为 6 的术语最多允许 1 个编辑。
在下面的第一个示例中,我们将配置 "AUTO:4,6",即具有最小 4 和最大 6 大小的术语。 我们将只能获得 1 个编辑。
POST idx_fuzzy/_doc
{
"text": "The city is more beautiful in summer"
}
GET idx_fuzzy/_search
{
"query": {
"match": {
"text": {
"query": "sumer",
"fuzziness": "AUTO:4,6"
}
}
}
}
上面的 AUTO 配置针对很多的开发者来说,可能并不熟悉。我们还是先来看看官方的文档:
AUTO
根据术语的长度生成编辑距离。 可以选择提供低距离和高距离参数 AUTO:[low],[high]。 如果未指定,则默认值为 3 和 6,相当于 AUTO:3,6 的长度:
0..2 | 必须完全匹配 |
3..5 | 允许一次编辑 |
>5 | 允许两次编辑 |
AUTO 通常应该是模糊性的首选值。
在上面,我们设置 AUTO 为 4,6,也就是说长度在 0..3,必须完全匹配,在 4..5 之间的,允许一次编辑,长度大于 5 的,允许两次编辑。上面的 sumer 长度为 5,它可以允许有一次编辑。下面的搜索也将会是成功的:
GET idx_fuzzy/_search
{
"query": {
"match": {
"text": {
"query": "summem",
"fuzziness": "AUTO:4,6"
}
}
}
}
它需要两次的编辑,因为 summem 的长度为 6。
如果把上面的配置修改为 AUTO: 6,7,那么如下的搜索:
GET idx_fuzzy/_search
{
"query": {
"match": {
"text": {
"query": "sumer",
"fuzziness": "AUTO:6,7"
}
}
}
}
将不会得到任何的结果,因为 sumer 的长度为 5。对于小于 5 的长度而言,必须完全匹配。
如果词条是 “beautiful”,我们会得到结果,因为词条的长度在 6 到 7 之间,并且会执行编辑。
POST idx_fuzzy/_doc
{
"text": "The city is more beautiful in summer"
}
GET idx_fuzzy/_search
{
"query": {
"match": {
"text": {
"query": "beatiful",
"fuzziness": "AUTO:6,7"
}
}
}
}
当术语的最小大小为 5 和最大为 7 时,我们可以获得 2 个编辑。beatifu -> beautiful文章来源:https://www.toymoban.com/news/detail-479308.html
POST idx_fuzzy/_doc
{
"text": "The city is more beautiful in summer"
}
GET idx_fuzzy/_search
{
"query": {
"match": {
"text": {
"query": "beatifu",
"fuzziness": "AUTO:6,7"
}
}
}
}
使用模糊性可能是获得类似术语结果的理想选择,但请始终注意你的配置,因为误报非常容易。文章来源地址https://www.toymoban.com/news/detail-479308.html
到了这里,关于Elasticsearch:使用 fuzziness 来进行搜索的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!