es实现公司简称匹配公司全称
发布网友
发布时间:2023-05-24 17:20
我来回答
共1个回答
热心网友
时间:2024-12-03 01:52
假设XY是某大型集团,集团下有XY金融科技有限公司,XY银行有限公司,XY证券有限公司等子公司
目标:用es实现公司简称匹配到公司全称,且尽可能准确
例如,XY金科能匹配出XY金融科技有限公司,但不希望匹配出XY银行有限公司和XY证券有限公司
如果用mysql的like,肯定达不到目标,因为"金融科技"中,"金"和"科"不连续
如果用ik分词器,XY金科也会匹配出XY银行和XY证券,因为都包含XY
于是有了另一个方案:
绝大多数情况下,公司简称的每一个字,都在公司全称里出现,且简称里每个字的出现顺序,跟全称里的出现顺序一致。
比如X、Y、金、科这四个字,在"XY金融科技有限公司"里都出现,且顺序一致。
如果能保证这个效果,匹配精确度应该挺高。
要实现公司简称的每一个字都在公司全称里出现
可以修改设置,在建立倒排索引时使用standard分词器,对文档按字拆分,查询时也指定standard分词器
但是这样的问题是,不能保证顺序,XY金科可以匹配出“XY科技金融有限公司”
查阅资料,发现match_phrase可以保证查询语句的分词结果,在字段的分词结果里都包含,且顺序相同,且必须连续。
但是问题来了,使用standard分词器时,“XY金科”的分词结果是X、Y、金、科,这四个字在“"XY金融科技有限公司”的分词结果中不连续,无法匹配。
查阅资料,发现可以通过配置slop,告诉match_phrase查询词条能够相隔多远时仍然将文档视为匹配,但是,由于公司简称和公司全称都不固定,slop也无法确定。
如果slop长度太小,简称会匹配不上全称,比如文档“XY金融科技有限公司”中“金”和“科”隔了1个字,“金”需要移动1次才能跟“科”相邻,所以slop>=1时,“XY金科”才能匹配上“XY金融科技有限公司”,但是如果查询词条的间隔大于设置的slop,又匹配不上。
如果slop设置的太大,就保证不了查询语句分词后结果在文档的分词结果中顺序一致,以下图为例,如果“金”移动到语句末尾时,移动次数<slop,就会继续移动,最后还是有可能匹配到“科”
(注:不清楚slop的移动规则,下图中slop设置为3同样可以匹配出两条结果)
后来,终于想到可行的方案
先把字段类型改为keyword,即索引时不分词,再使用正则表达式查询,在每一个字间加上*通配符,比如"XY金科"的正则表达式是"*X*Y*金*科*",这样又能保证每个字都出现,也能保证顺序