Hello,World

es高亮在项目中该怎么使用?

Elasticsearch | 作者 ydzll | 发布于2019年10月17日 | 阅读数:5339

我发现高亮会作为一个对象,单独返回,不会改变source中的值,那我返回到前端,该怎么显示呢?前端要展示该字段,取source里的值吧,没高亮标签,取高亮对象的值吧,又缺失未高亮的数据,因为该字段是多值。那么高亮功能到底该怎样用呢?
已邀请:

ydzll

赞同来自:

es.png

就比如这种情况,不能将高亮标签直接插入到_source里吗?提到外面单独的对象,感觉没法用啊,取哪个都不对,我真正想要的数据实际上是["bad <em>apple</em>", "bad banana"],你们是怎么处理这个问题的啊?是不是es的高亮功能根本不适合项目中去用啊

laoyang360 - 《一本书讲透Elasticsearch》作者,Elastic认证工程师 [死磕Elasitcsearch]知识星球地址:http://t.cn/RmwM3N9;微信公众号:铭毅天下; 博客:https://elastic.blog.csdn.net

赞同来自:

官方不支持这种方式,几年前就有人提bug,官方没有解决。
https://github.com/elastic/ela ... /7416
 
网友的实现替代方案:

[ "1", "2", "3" ] [ "Alice", "John Doe", "Bob" 
]instead of using objects with ID
[{id:"1", name: "Alice"}, {id:"2", name: "John Doe"}, {id: "3", name:"Bob"} ]
 

EricTowns

赞同来自:

是的,我在使用ES高亮的时候也是十分困惑,一般网上的做法是将高亮部分Map中的字段替换给Source中的对应字段。类似于这样


Map<String, HighlightField> highlightFields = hit.getHighlightFields();
//替换字段title高亮
HighlightField titleField = highlightFields.get("title");
    Map<String, Object> source = hit.getSource();
    if(titleField!=null){
        Text[] fragments = titleField.fragments();
        String name = "";
        for (Text text : fragments) {
            name+=text;
        }
        //替换掉source的内容
        source.put("title", name);
    }

//替换字段describe高亮
HighlightField describeField = highlightFields.get("describe");
if(describeField!=null){
    Text[] fragments = describeField.fragments();
    String describe = "";
    for (Text text : fragments) {
        describe+=text;
    }
    source.put("describe", describe);
}
//后续操作
list.add(source);


这样的做法显得太不优雅,而且代码量会提高。另外在使用Jest时(transportClient还没有试过),我发现一个问题,
例如,源文档中字段title为“为什么会这样呢?你知道么?。。。”,查询字段为“你知道么”时,高亮替换会导致最后只显示“你知道么?。。。”,会丢失问号前面的部分,加大framentSize属性也不起作用,不知道老哥有没有什么好的解决办法?

laoyang360 - 《一本书讲透Elasticsearch》作者,Elastic认证工程师 [死磕Elasitcsearch]知识星球地址:http://t.cn/RmwM3N9;微信公众号:铭毅天下; 博客:https://elastic.blog.csdn.net

赞同来自:

自己实现了,通过正则匹配,高亮处理

chenygs

赞同来自:

老哥  你的这种方式我也想过,但是怎么处理中英文数字等在一起时搜索 的正则

要回复问题请先登录注册