我有一个艺术家名字的档案。我正在尝试搜索芝加哥艺术学院的 REST API,寻找这些艺术家的作品。文件中的名字之一是“Romare Beardon”。我的 Elasticsearch 查询什么也没找到。
criteria = {
"query": {"match_phrase" : {"artist_title": "romare beardon"}}
}
问题在于该文件的姓氏拼写错误(s/b“Bearden”),并且该研究所将艺术家的名字列为“Romare Howard Bearden”。
因此,我的查询需要原谅轻微的拼写错误并考虑中间名。
我已经尝试过“slop”
criteria = {
"query" : {"match_phrase": {"artist_title": {"query":"Romare Bearden", "slop":1 }}},
}
这正确地找到了 Romare Howard Bearden!
我已经尝试过模糊性:
criteria = {
"query": {
"fuzzy" : {"artist_title": {"value": "Beardon", "fuzziness": "AUTO"}}},
}
这会找到“Bearden”,但也会找到“Pearson”。不能接受的。
将 AUTO 更改为 1 不会返回任何结果。将 AUTO 更改为 2 将返回“Bearden”和“Pearson”。不能接受的。
任何人都可以帮我编写一个查询,可以采用“Romare Beardon”并找到“Romare Howard Bearden”。它需要进行泛化,以便任何名字和姓氏,即使稍微拼写错误,也能高精度地找到第一个中间的最后一个。
我可以想到一种可能的解决方案,您可以将
artist_title
文本拆分为单词,然后在搜索文本之上应用模糊性,如下所示:在为弹性索引创建映射时可以指定以下空白分析器:
如上所述,elastic 中存在的 Artist_title 是
Romare Howard Bearden
和Pearson
。对于搜索文本:
Romar Beardon
,具有模糊性的搜索查询将是:这将给出带有草率文本和名字和姓氏组合的预期结果
Romare Howard Bearden
。解释:
在映射创建过程中,空白分析器会分解文本并单独索引它们,稍后作为模糊文本单独查询时会产生结果。然而,搜索文本需要被分割并单独添加为模糊查询。该
fuzziness
值可以从 AUTO 更改为任何整数,以指定要应用的模糊度数。对于
AUTO
,根据Docs:或者,如果
"fuzziness": "2"
,则为了生成搜索结果,允许的最大模糊字符数为 2。例如,Roma
也会生成 2 个字符r
且e
缺失的搜索结果。希望这可以帮助。