我有点怀疑你在刷屏

使用ES做【搜索框】检索功能遇到问题

Elasticsearch | 作者 heipark | 发布于2019年12月16日 | 阅读数:2767

软件版本;ES 6.3.2
运行环境;CentOS6
 需求:
页面上有个搜索框,用户可以输入table_name、comments查找
 
索引:
我创建了一个索引,两个字段:

1. table_name字段:分词:下划线;示例:s_amap_userid_idbank
2. comments字段:分词IK中文分词;示例:从前有座山

输入:
用户输入:”s_amap_userid_idbank 用户数据“,前面为table name 后面为comments(也可以只输入name或者comments)

检索语句:
GET my_tables/_search
{
"query": {
  "bool": {
     "should": [
          {
             "match_phrase": {
                "table_name": { "query": "s_amap_userid_idbank 用户数据", "boost": 2 }
             }
          } ,
         {
           "match_phrase": {
               "comments": {"query": "s_amap_userid_idbank 用户数据"} }
          }
     ]
  }
 }
}

问题:
如果table_name使用match_phrase,则检索不到东西(因为输入里面有comments)
如果table_name改为match,则会检索到大量相关性很低的结果
 
请教各位,谢谢
已邀请:

heipark

赞同来自: tacsklet

我修改了接口,每次用户请求做两次ES查询:
第一次:通过match_parase 只查询table name,这样99%的场景可以获得精准的匹配
如果第一次返回空,则通过match同时查询table name和 comment。

envy666

赞同来自:

你为什么要把属于两个字段的内容拼在一起后在一个字段中检索呢?逻辑上是有问题的呀

tacsklet - 公司有用到es

赞同来自:

我也觉得这样不是很合理,不过如果要这么搜索的话,可以这么写,或者使用_all类型的字段:
GET my_tables/_search
{
"query": {
"bool": {
"should": [
{
"match_phrase": {
"table_name": { "query": "s_amap_userid_idbank", "boost": 2 }
}
} ,
{
"match_phrase": {
"comments": {"query": "用户数据"} }
}
]
}
}
}

要回复问题请先登录注册