栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用ElasticSearch模拟SQL LIKE搜索

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用ElasticSearch模拟SQL LIKE搜索

我会这样做:

  • 将令牌生成器更改为
    edge_nGram
    您曾说过的需要
    LIKE 'CityName%'
    (表示前缀匹配):
      "tokenizer": {        "autocomplete_edge": {          "type": "edge_nGram",          "min_gram": 1,          "max_gram": 100        }      }
  • 将字段指定
    autocomplete_search
    search_analyzer
    。我认为拥有
    keyword
    and 是一个不错的选择
    lowercase
      "mappings": {        "listing": {          "properties": { "city": {   "type": "string",   "index_analyzer": "autocomplete_term",   "search_analyzer": "autocomplete_search" }          }        }      }
  • 查询本身很简单:
    {      "query": {        "multi_match": {          "query": "R",          "fields": [ "city"          ]        }      }    }

详细的解释是这样的:将城市名称分割为ngram。例如,

Rio de Janeiro
您将为以下内容编制索引:

    "city": [       "r",       "ri",       "rio",       "rio ",       "rio d",       "rio de",       "rio de ",       "rio de j",       "rio de ja",       "rio de jan",       "rio de jane",       "rio de janei",       "rio de janeir",       "rio de janeiro"    ]

您会注意到所有内容都是小写的。现在,您希望查询采用任何文本(是否为小写),并将其与索引中的内容匹配。因此,

R
应该与上面的列表匹配。

为此,您希望输入文本小写并与用户设置的文本保持一致,这意味着不应对其进行分析。你为什么要这个?因为您已经用ngram分割了城市名称,并且不想为输入文本使用相同的名称。如果用户输入“
RI”,Elasticsearch将小写

ri
--并将其与索引中的内容完全匹配。

可能更快的替代方法

multi_match
是使用
term
,但这要求您的应用程序/网站将文本小写。这样做的原因是
term
根本不分析输入文本。

    {      "query": {        "filtered": {          "filter": { "term": {   "city": {     "value": "ri"   } }          }        }      }    }


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/413014.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号