Elasticsearch:多个部分单词的得分不够高

问题描述 投票:2回答:1

所以我试图从Elasticsearch安装中获得良好的搜索结果。但是,当我尝试对一些非常简单的数据进行模糊搜索时会遇到问题。当搜索查询中出现多个单词单词时,不知何故多个单词(其中一些是不完整的单词)得分太低,而得分更高。

让我解释一下:我有一个包含两个简单文档的简单索引。

{
    "name": "Product with good qualities and awesome sound system"
},
{
    "name": "Another Product that has better acustics than the other one"
}

现在我使用此参数查询索引:

{
    "query": {
        "multi_match": {
            "fields": ["name"],
            "query": "product acust",
            "fuzziness": "auto"
        }
    }
}

结果看起来像这样:

"hits": [
        {
            "_index": "test_products",
            "_type": "_doc",
            "_id": "1",
            "_score": 0.19100355,
            "_source": {
                "name": "Product with good qualities and awesome sound system"
            }
        },
        {
            "_index": "test_products",
            "_type": "_doc",
            "_id": "2",
            "_score": 0.17439455,
            "_source": {
                "name": "Another Product that has better acustics than the other one"
            }
        }
    ]

您可以看到ID 2的产品得分比其他产品低,尽管它与给定查询字符串的相似性可能比其他产品更高,因为它具有1个全字匹配和1个部分字匹配。当查询看起来像“产品acusti”时,结果将开始正确运行。我已经摆弄了布尔搜索,但结果是相同的。

有什么主意,比我几乎要输入第二个单词要快得多吗?

elasticsearch
1个回答
1
投票

据我所知,Elasticsearch默认情况下不进行部分单词匹配,因此在您的两个文档中都不匹配术语acust

您在第一个文档中获得较高分数的原因是,匹配词product出现在较短的句子中:

具有良好品质和出色音质的产品

但是对于第二份文档,product出现在一个较长的句子中:

具有比其他产品更好的声学效果的另一产品>]

因此您的第二份文档得分较低,因为匹配词(乘积)与句子中词数的比率较低。

换句话说,是在较低的Field length normalization

norm = 1/sqrt(numFieldTerms)

现在,如果您希望能够进行部分前缀匹配,则需要将术语标记为ngrams,例如,您可以为术语“声学”创建以下ngram:]]

“ ac”,“ aco”,“ acou”,“ acous”,“ acoust”,“ acousti”,“ acoustic”,“ acoustics”

您有2个选项可以实现此目的,请参阅this question上Russ Cam的回答>

  1. 使用Analyze API使用分析器将字段标记为来自的标记/术语您想要部分前缀匹配的内容,并将其编入索引集合作为完成字段的输入。标准分析仪可能是一个很好的开始...

  2. 请勿在此处使用“完成建议”,而是使用以下命令将您的字段(名称)设置为文本数据类型multi-fields包括应该分析名称(或不分析名称)的不同方法分析,例如带有关键字子字段)。花一些时间使用Analyze API来构建一个分析器允许在名称中的任何位置使用部分词前缀。首先,像是标准标记器,小写标记过滤器Edgengram令牌过滤器和可能的Stop令牌过滤器可以帮助您运行...

  3. 您可能还会发现this guide有用。

© www.soinside.com 2019 - 2024. All rights reserved.