Elasticsearch - 模糊搜索不提供建议
Elasticsearch - Fuzzy search not giving suggestions
我正在尝试通过 NodeJS 在 Elasticsearch 中实现 fuzzy/autocomplete 搜索。我已按索引 "artist"
对数据进行索引。这是在 ES 中存储数据的示例。
{
"hits": [{
"_index": "artist",
"_type": "_doc",
"_id": "EyejqnAB2pHGVJHwV53Q",
"_score": 1,
"_source": {
"kind": "song",
"artistId": 111051,
"artistName": "Eminem",
"trackName": "Crack a Bottle (feat. Dr. Dre & 50 Cent)",
"collectionName": "Relapse (Deluxe Version)",
"collectionCensoredName": "Relapse (Deluxe Version)",
"artistViewUrl": "https://music.apple.com/us/artist/eminem/111051?uo=4",
"collectionViewUrl": "https://music.apple.com/us/album/crack-a-bottle-feat-dr-dre-50-cent-feat-dr-dre-50-cent/1440558626?i=1440558826&uo=4",
"trackViewUrl": "https://music.apple.com/us/album/crack-a-bottle-feat-dr-dre-50-cent-feat-dr-dre-50-cent/1440558626?i=1440558826&uo=4",
"previewUrl": "https://audio-ssl.itunes.apple.com/itunes-assets/AudioPreview128/v4/da/a5/c1/daa5c140-2c3d-1f74-40c3-b6e596e52b82/mzaf_7480202713407880256.plus.aac.p.m4a",
"artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Music128/v4/c5/f8/fd/c5f8fdf6-d4c9-85c9-d169-c5d349a44f1c/source/100x100bb.jpg",
"collectionPrice": 12.99,
"releaseDate": "2009-02-02T12:00:00Z",
"collectionExplicitness": "explicit",
"trackExplicitness": "explicit",
"discCount": 1,
"discNumber": 1,
"trackCount": 24,
"trackNumber": 18,
"country": "USA",
"currency": "USD"
}
}]
}
以上 artistName
的值为 Eminem
,问题是当我键入 'e'
时,它没有显示任何内容,在 'em'
、[=16= 上也是如此], emin
.当我输入 emine
然后它开始给出结果。我哪里错了?
Match query returns 与提供的文本、数字、日期或布尔值匹配的文档。在匹配之前分析提供的文本。
ex text :"this is a test" 使用标准分析器存储为 ["this","is", "a", "token"]
您正在搜索的文本也将被分解为标记,并且将匹配这些标记。
模糊度:采用单个术语并在字典中查找所有在指定模糊度范围内的术语。默认模糊度为 AUTO。
以下是自动值
自动——它根据术语的长度生成一个编辑距离。对于长度:
0..2 -- 必须完全匹配
3..5 -- 允许一次编辑
5 -- two edits allowed
因此您可以搜索 "emine",因为编辑距离为 1
要实现自动完成,您可以使用
1.EdgeNgrams
2.完成建议
以上参考链接
1. AutoCompletion
2.Fuzziness
有多种方法可以实现自动完成功能,模糊搜索不是正确的方法(它主要用于搜索相关文档w.r.t to tokens(de-dupe)和拼写检查模糊搜索的应用请参考this。
对于您的情况,如果您的索引大小不是很大并且将最小字符长度限制为两个,我建议使用prefix query,即不要t 搜索 e
并仅在用户键入两个或更多字符时显示搜索结果,即 em
或 emi
、emin
等
工作示例
索引映射
{
"mappings": {
"properties": {
"artistName": {
"type": "text"
}
}
}
}
索引文件
{
"artistName" : "Eminem"
}
{
"artistName" : "Emiten"
}
搜索查询
{
"query": {
"prefix": {
"artistName": {
"value": "em"
}
}
}
}
搜索结果
{
"_index": "so-60558525-auto",
"_type": "_doc",
"_id": "1",
"_score": 1.0,
"_source": {
"artistName": "Eminem"
}
},
{
"_index": "so-60558525-auto",
"_type": "_doc",
"_id": "2",
"_score": 1.0,
"_source": {
"artistName": "Emiten"
}
}
重要阅读
您可以选择 大致四种方法来实现自动完成 ,并且每种方法都有一些权衡取舍,您应该知道如何证明您的功能要求是合理的以及非功能性(性能、维护、实施困难)。
我正在尝试通过 NodeJS 在 Elasticsearch 中实现 fuzzy/autocomplete 搜索。我已按索引 "artist"
对数据进行索引。这是在 ES 中存储数据的示例。
{
"hits": [{
"_index": "artist",
"_type": "_doc",
"_id": "EyejqnAB2pHGVJHwV53Q",
"_score": 1,
"_source": {
"kind": "song",
"artistId": 111051,
"artistName": "Eminem",
"trackName": "Crack a Bottle (feat. Dr. Dre & 50 Cent)",
"collectionName": "Relapse (Deluxe Version)",
"collectionCensoredName": "Relapse (Deluxe Version)",
"artistViewUrl": "https://music.apple.com/us/artist/eminem/111051?uo=4",
"collectionViewUrl": "https://music.apple.com/us/album/crack-a-bottle-feat-dr-dre-50-cent-feat-dr-dre-50-cent/1440558626?i=1440558826&uo=4",
"trackViewUrl": "https://music.apple.com/us/album/crack-a-bottle-feat-dr-dre-50-cent-feat-dr-dre-50-cent/1440558626?i=1440558826&uo=4",
"previewUrl": "https://audio-ssl.itunes.apple.com/itunes-assets/AudioPreview128/v4/da/a5/c1/daa5c140-2c3d-1f74-40c3-b6e596e52b82/mzaf_7480202713407880256.plus.aac.p.m4a",
"artworkUrl100": "https://is1-ssl.mzstatic.com/image/thumb/Music128/v4/c5/f8/fd/c5f8fdf6-d4c9-85c9-d169-c5d349a44f1c/source/100x100bb.jpg",
"collectionPrice": 12.99,
"releaseDate": "2009-02-02T12:00:00Z",
"collectionExplicitness": "explicit",
"trackExplicitness": "explicit",
"discCount": 1,
"discNumber": 1,
"trackCount": 24,
"trackNumber": 18,
"country": "USA",
"currency": "USD"
}
}]
}
以上 artistName
的值为 Eminem
,问题是当我键入 'e'
时,它没有显示任何内容,在 'em'
、[=16= 上也是如此], emin
.当我输入 emine
然后它开始给出结果。我哪里错了?
Match query returns 与提供的文本、数字、日期或布尔值匹配的文档。在匹配之前分析提供的文本。 ex text :"this is a test" 使用标准分析器存储为 ["this","is", "a", "token"] 您正在搜索的文本也将被分解为标记,并且将匹配这些标记。
模糊度:采用单个术语并在字典中查找所有在指定模糊度范围内的术语。默认模糊度为 AUTO。
以下是自动值 自动——它根据术语的长度生成一个编辑距离。对于长度: 0..2 -- 必须完全匹配 3..5 -- 允许一次编辑
5 -- two edits allowed
因此您可以搜索 "emine",因为编辑距离为 1
要实现自动完成,您可以使用 1.EdgeNgrams 2.完成建议
以上参考链接 1. AutoCompletion 2.Fuzziness
有多种方法可以实现自动完成功能,模糊搜索不是正确的方法(它主要用于搜索相关文档w.r.t to tokens(de-dupe)和拼写检查模糊搜索的应用请参考this。
对于您的情况,如果您的索引大小不是很大并且将最小字符长度限制为两个,我建议使用prefix query,即不要t 搜索 e
并仅在用户键入两个或更多字符时显示搜索结果,即 em
或 emi
、emin
等
工作示例
索引映射
{
"mappings": {
"properties": {
"artistName": {
"type": "text"
}
}
}
}
索引文件
{
"artistName" : "Eminem"
}
{
"artistName" : "Emiten"
}
搜索查询
{
"query": {
"prefix": {
"artistName": {
"value": "em"
}
}
}
}
搜索结果
{
"_index": "so-60558525-auto",
"_type": "_doc",
"_id": "1",
"_score": 1.0,
"_source": {
"artistName": "Eminem"
}
},
{
"_index": "so-60558525-auto",
"_type": "_doc",
"_id": "2",
"_score": 1.0,
"_source": {
"artistName": "Emiten"
}
}
重要阅读
您可以选择 大致四种方法来实现自动完成 ,并且每种方法都有一些权衡取舍,您应该知道如何证明您的功能要求是合理的以及非功能性(性能、维护、实施困难)。