所以我试图从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默认情况下不进行部分单词匹配,因此在您的两个文档中都不匹配术语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的回答>
使用Analyze API使用分析器将字段标记为来自的标记/术语您想要部分前缀匹配的内容,并将其编入索引集合作为完成字段的输入。标准分析仪可能是一个很好的开始...
请勿在此处使用“完成建议”,而是使用以下命令将您的字段(名称)设置为文本数据类型multi-fields包括应该分析名称(或不分析名称)的不同方法分析,例如带有关键字子字段)。花一些时间使用Analyze API来构建一个分析器允许在名称中的任何位置使用部分词前缀。首先,像是标准标记器,小写标记过滤器Edgengram令牌过滤器和可能的Stop令牌过滤器可以帮助您运行...
您可能还会发现this guide有用。