背景:我使用mysql,有数百万的数据,每行有20列,我们有一些复杂的搜索和一些列使用模糊匹配,如 username like '%aaa%'
,除非删除第一个索引,否则不能使用mysql索引 %
,但是我们需要模糊匹配来做搜索,比如satckoverflow搜索,我也检查了mysql fulltext index
,但如果使用其他索引,则不支持在一个sql中进行复杂搜索。
我的解决方案是:添加elasticsearch作为我们的搜索引擎,将数据插入mysql和es,只在elasticsearch中搜索数据
我查过elasticsearch模糊搜索, wildcard
有效,但许多人不建议使用 *
在词的开头,它会使搜索非常慢。
例如:username:'john\u snow' wildcard
工作,但可能很慢
GET /user/_search
{
"query": {
"wildcard": {
"username": "*hn*"
}
}
}
``` `match_phrase` 不起作用似乎只对“john snow”这样的标记词起作用
{
"query": {
"match_phrase":{
"dbName": "hn"
}
}
}
我的问题:有没有更好的解决方案来执行包含模糊匹配的复杂查询,如“%no%”或“%hn\u sn%”。
1条答案
按热度按时间50pmv0ei1#
您可以使用ngram标记器,当遇到指定字符列表中的一个字符时,它首先将文本分解为单词,然后发出指定长度的每个单词的n-gram。
添加索引数据、Map、搜索查询和结果的工作示例。
索引Map:
分析api
代币包括:
索引数据:
搜索查询:
搜索结果:
如果你想做一个自动完成的搜索,请参考这个博客。
另一个搜索查询
上面的搜索查询没有显示结果