前言
有关通用的postgres数据库全文检索在ef core中的使用方式,参见我的上一篇文章。
本文实践了zhparser中文插件举行全文检索。
准备工作
安装插件,最利便的方式是直接使用安装好插件的docker镜像,好比
docker pull chenxinaz/zhparser
该镜像的postgres数据库版本为10,若是你想要更新的版本,可以自行建立dockerfile举行build。
使用如下下令启动你的容器,侦听在5432端口。
docker run --name pgcn -p 5432:5432 -e POSTGRES_PASSWORD=123456 -d chenxinaz/zhparser
修改migration文件
找到上篇文章添加触发器的代码,在其之前加入代码,注册组件。
migrationBuilder.Sql(@"CREATE EXTENSION zhparser;"); migrationBuilder.Sql(@"CREATE TEXT SEARCH CONFIGURATION chinese_zh (PARSER = zhparser);"); migrationBuilder.Sql(@"ALTER TEXT SEARCH CONFIGURATION chinese_zh ADD MAPPING FOR n,v,a,i,e,l WITH simple;"); migrationBuilder.Sql( @"CREATE TRIGGER article_title_search_vector_update BEFORE INSERT OR UPDATE ON articles FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger(title_vector, 'public.chinese_zh', title);"); migrationBuilder.Sql( @"CREATE TRIGGER article_abst_search_vector_update BEFORE INSERT OR UPDATE ON articles FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger(abst_vector, 'public.chinese_zh', abst);");
注重触发器使用的插件名称前面的public。
修改完毕后,执行`dotnet ef database update`,建立数据库。
修改查询代码
var query = "阿一土鳖"; var config = "chinese_zh"; var data = db.Articles .Where(p => p.TitleVector.Matches(EF.Functions.ToTsQuery(config, query)) || p.AbstVector.Matches(EF.Functions.ToTsQuery(config, query))) .OrderByDescending(p => p.TitleVector.Rank(EF.Functions.ToTsQuery(config, query)) * 2.0 + p.AbstVector.Rank(EF.Functions.ToTsQuery(config, query))) .Select(p => new Article { Title = p.Title, Abst = p.Abst, TitleHL = EF.Functions.ToTsQuery(config, query).GetResultHeadline(config, p.Title, ""), AbstHL = EF.Functions.ToTsQuery(config, query).GetResultHeadline(config, p.Abst, ""), });
注重所有的地方都要加config,声明使用的parser类型;若是漏掉了一些config,可能导致查询效果禁绝或者无法高亮等问题。
代码一直的重复ToTsQuery,不知道是否有便捷的写法?
查询发现,能够掷中数据库表中的“阿一土鳖”纪录,然则词向量字段只有“土鳖”,其他都被看成住手词过滤了,为了更正确的查询,识别“阿一土鳖”这个词语,需要引入自定义词典。
自定义词典
这里为了简朴,直接在容器内添加和修改文件,人人可以自行接纳更高效率的方式更新字典和设置。
#进入容器: docker exec -it <容器名称> /bin/bash #进入目录: cd /usr/share/postgresql/10/tsearch_data #添加文件 touch chinese.txt #向文件添加一行自定义词汇: echo "阿一土鳖 1 1 n" >> chinese.txt,后面的1 1 n,分别是TF/IDF/词性。 #修改conf文件,引入自定义词典: echo "zhparser.extra_dicts = 'chinese.txt'" >> /var/lib/postgresql/data/postgresql.conf #退出容器。 exit #重启容器: docker restart <容器名称>
重新索引数据
自定义词典更新后,若是需要重修索引,只需要执行sql更新相关字段,就会触发更新索引的操作,从而更新vectors字段。
update articles set title = title
再次执行查询,发现已经能正确匹配到新词汇。
,
阳光在线www.9cx.net(原诚信在线)现已开放阳光在线手机版下载。阳光在线游戏公平、公开、公正,用实力赢取信誉。
网友评论
最新评论
欧博allbet客户端欢迎进入欧博allbet客户端(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。就问你好不好看!
@Usappledeveloperaccountsforsale 欧博网址开户www.sunbet.us欢迎进入欧博网址(Allbet Gaming),欧博网址开放会员注册、代理开户、电脑客户端下载、苹果安卓下载等业务。办公室必聊~很火
约谈强调, 各平台公司要排查自身问题,立刻整改。要加速推进合规化,制订切实可行的网约车合规化事情方案,明确时间表、目的和事情行动,稀奇是要提出到今年年底前,车辆、驾驶员合规化事情的详细目的。情节好曲折。