使用 man ascii 来查看 ASCII 表。

如何比较高效的实现类似sql中的like '%xx%'查询?

Elasticsearch | 作者 vergilyn | 发布于2019年07月16日 | 阅读数:2650

elasticsearch version: 6.4.2
 
例如INDEX结构:
{
"mappings": {
"_doc": {
"properties": {
"title": {
"type": "text",
"analyzer": "ik_max_word",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}
}

原来只是对`title`进行match-query,但是(个人小白)觉得,可能是因为词典不足,导致最后的score并不理想,所以准确度和排序都不是很理想。
(原来是用的sql模糊查询)
在看了大佬的文章:Elastic 搜索开发实战 > 站内搜索 > 搞定搜索框 > 优化查询 后受益匪浅。确定会增加`prefix-query`。
但是为了更加准确,或者最大化保留原来sql查询的习惯。想实现类似sql的like '%XXX%'的查询。
 
现在个人查到的几种方案:
1. wildcard/regexp query。官网不建议wildcard query以 */? 开头,`Note that this query can be slow, as it needs to iterate over many terms.` 。
  那么如果我是针对`title.keyword`(长度20~50左右)做wildcard/regexp query 的性能如何?(数据量 200百万 以内,数据结构 新闻/博客 这类)
 
2.  fuzzy query 感觉不太能满足
 
3. script 的 contains
  参考:ES查询怎么才能实现类似contains的功能?
 
(我现在的想法 可能是先简单的用 wildcard query,但不清楚`*xxx*`是否可以。单独的`xxx*`不满足我的期望)
已邀请:

Ombres

赞同来自:

1. title.keyword的数量是200W,应该基本不会有重复,那么也就是说这个字段的词典的term就会有200W个,使用wildcard可能会有性能影响,具体取决于你们的硬件,这个需要你们自己测试了
2. 或许可以考虑title用standard分词器,然后搜索的时候使用match_phrase进行搜索,slop为0的情况下,"汽车"这种搜索条件最终的搜索结果是只有包含紧邻的"汽","车"两字时才会被召回,应该也能满足你们需求

要回复问题请先登录注册