Q:非洲食人族的酋长吃什么?

Elasticsearch中文分词器问题

Elasticsearch | 作者 F91 | 发布于2018年10月31日 | 阅读数:6515

【场      景】搜索公司名,查询匹配度高的公司名称。(公司名都为中文)
【分  词 器】ik
【问题描述】
    根据公司名称的关键词或者全名,查询匹配的公司。使用ik_max_word搜索公司全名,如华为科技技术有限公司,那把库里带有有限公司这些词的公司都查出来了。按照权重排序后,虽然匹配度较高的在最前边,但是企业名中包含查询关键词的企业权重不一定最高,如搜索“华为技术有限公司”,权重最高的是“华为xx技术有限公司”。短语形的搜索:如“华为技术”,满足权重最高的也是“华为xx技术有限公司”。
用ik_smart分词,测试“华为科技技术有限公司”,结果“华为技术有限公司”排在了很后边,前边权重高的几乎都是只有有限公司的企业。
【理想结果】查询华为科技,匹配度最高的 【华为科技】权重值最高。也就是说搜索的关键词短语全称,如果说 说的全匹配上,权重值就最高。简单点说,就是like形式的搜索结果权重值最高。
【问      题】
1、如何实现上述描述的搜索结果?包含搜索关键词的企业权重最高。
2、企业名中都点有【公司】、【有限公司】、【集团】之类的比较范的关键词,这部分查询如何做过滤?
2、针对分词如何设置权重?
3、中文分词器好用的或者常用的有哪些?
 
已邀请:

kennywu76 - Wood

赞同来自: laoyang360 juin F91

提供一个思路供参考:
 
公司名称可以索引为multi-filed,即一个为keyword类型,一个为text类型。 查询的时候,使用bool Query,对两个字段分别查询后用should连接, 这样完全匹配的公司名称相关度比部分匹配的高,排在前面优先返回。
 
例如:
{
"query": {
"bool": {
"should": [
{
"term": {
"company.keyword": {
"value": "华为科技"
}
}
},
{
"match": {
"company": {
"value": "华为科技"
}
}
}
]
}
}
}

对于常用词的滤除,一个可以考虑在分词器中,将常用词定义为stop word, 从而在分词阶段就滤除掉。 另外也可以通过boosting Query,降低这类词的打分权重。 参考: not-quite-not.html

rochy - rochy_he

赞同来自: kennywu76

你可以借助 disMaxQuery 来实现你的需求
disMaxQuery 中使用 matchPhraseQuery 与 matchQuery 来结合;设置 tie_breaker 来调节两个查询语句的得分占比
对于 有限公司 是不需要过滤的,不过你可以通过设置 cutoff_frequency 来过滤出现频率很高的一切词语
分词器使用 ik 即可

liujia

赞同来自: kennywu76

再提供一个思路~
 
http://ohmycat.me/elasticsearc ... .html

sylvanas

赞同来自:

和你一样的需求,目前用着solr,效果很差,整研究ES,也要实现这个恶心的企业名称分词。。。。

要回复问题请先登录注册