首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Elasticsearch -模糊搜索没有给出建议

Elasticsearch -模糊搜索没有给出建议
EN

Stack Overflow用户
提问于 2020-03-05 22:15:08
回答 2查看 823关注 0票数 2

我试图通过NodeJS在Elasticsearch中实现一个模糊/自动完成搜索。我已经按索引"artist"索引了数据。下面是ES中存储的数据的示例。

代码语言:javascript
运行
AI代码解释
复制
{
  "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"
    }
  }]
}

上面的artistNameEminem一样有价值,问题是当我输入'e'时,它没有显示任何东西,在'em'emiemin上也是如此。当我输入emine时,它就开始给出结果。我哪里出问题了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-06 00:03:48

实现自动完成功能的方法有多种,模糊搜索是不正确的(它主要用于搜索相关文档w.r.t到令牌(Dupe)和拼写检查器中引用,用于模糊搜索的应用)。

在您的情况下,如果索引大小不是很大,并且将最小字符长度限制为两个,那么我建议使用 前缀查询 ,即不要搜索e,只有当用户键入两个或多个字符( ememiemin等)时才显示搜索结果。

工作实例

索引映射

代码语言:javascript
运行
AI代码解释
复制
{
    "mappings": {
        "properties": {
            "artistName": {
                "type": "text"
            }
        }
    }
}

索引文档

代码语言:javascript
运行
AI代码解释
复制
{
   "artistName" : "Eminem"
}

{
   "artistName" : "Emiten"
}

搜索查询

代码语言:javascript
运行
AI代码解释
复制
{
    "query": {
        "prefix": {
            "artistName": {
                "value": "em"
            }
        }
    }
}

搜索结果

代码语言:javascript
运行
AI代码解释
复制
{
            "_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"
            }
         }

重要阅读

大致上有四种实现自动完成的方法,每一种方法都有一些折衷,您应该意识到为您的功能需求以及非功能性(性能、维护、实现困难)辩护。

票数 1
EN

Stack Overflow用户

发布于 2020-03-05 22:41:14

匹配查询返回与提供的文本、数字、日期或布尔值匹配的文档。在匹配之前对所提供的文本进行分析。示例文本:“这是一个测试”与标准分析器存储为"this“、" is”、"a“、"token”文本,您正在搜索的文本也将被分解为令牌,并且这些令牌将被匹配。

模糊性:取一个术语,并在字典中找到所有在指定模糊范围内的术语。默认的模糊性是自动的。

下面是auto的值--它根据术语的长度生成编辑距离。长度: 0..2 -必须完全匹配3..5 -允许一次编辑

5-允许两次编辑

因此,您可以搜索"emine“,因为编辑距离为1。

要实现自动完成,可以使用1. EdgeNgrams 2.完成提示程序。

指向上述1.AutoCompletion 2. 模糊性的链接

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60558525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文