在ef core中使用postgres数据库的全文检索功能实战之中文支持
前言
有关通用的postgres数据库全文检索在ef core中的使用方法,参见我的上一篇文章。
本文实践了zhparser中文插件进行全文检索。
准备工作
安装插件,最方便的方法是直接使用安装好插件的docker镜像,比如
docker pull chenxinaz/zhparser
该镜像的postgres数据库版本为10,如果你想要更新的版本,可以自行创建dockerfile进行build。
使用如下命令启动你的容器,侦听在5432端口。
docker run --name pgcn -p : -e POSTGRES_PASSWORD= -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//tsearch_data
#添加文件
touch chinese.txt
#向文件添加一行自定义词汇:
echo "阿一土鳖 1 1 n" >> chinese.txt,后面的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
再次执行查询,发现已经能精确匹配到新词汇。
在ef core中使用postgres数据库的全文检索功能实战之中文支持的更多相关文章
- 在ef core中使用postgres数据库的全文检索功能实战
起源 之前做的很多项目都使用solr/elasticsearch作为全文检索引擎,它们功能全面而强大,但是对于较小的项目而言,构建和维护成本显然过高,尤其是从关系数据库/文档数据库到全文检索引擎的数据 ...
- EF Core中如何设置数据库表自己与自己的多对多关系
本文的代码基于.NET Core 3.0和EF Core 3.0 有时候在数据库设计中,一个表自己会和自己是多对多关系. 在SQL Server数据库中,现在我们有Person表,代表一个人,建表语句 ...
- EF Core中,通过实体类向SQL Server数据库表中插入数据后,实体对象是如何得到数据库表中的默认值的
我们使用EF Core的实体类向SQL Server数据库表中插入数据后,如果数据库表中有自增列或默认值列,那么EF Core的实体对象也会返回插入到数据库表中的默认值. 下面我们通过例子来展示,EF ...
- EF Core 中多次从数据库查询实体数据,DbContext跟踪实体的情况
使用EF Core时,如果多次从数据库中查询一个表的同一行数据,DbContext中跟踪(track)的实体到底有几个呢?我们下面就分情况讨论下. 数据库 首先我们的数据库中有一个Person表,其建 ...
- EF Core中怎么实现自动更新实体的属性值到数据库
我们在开发系统的时候,经常会遇到这种需求数据库表中的行被更新时需要自动更新某些列. 数据库 比如下面的Person表有一列UpdateTime,这列数据要求在行被更新后自动更新为系统的当前时间. Pe ...
- [小技巧]EF Core中如何获取上下文中操作过的实体
原文地址:https://www.cnblogs.com/lwqlun/p/10576443.html 作者:Lamond Lu 源代码:https://github.com/lamondlu/EFC ...
- EF Core中避免贫血模型的三种行之有效的方法(翻译)
Paul Hiles: 3 ways to avoid an anemic domain model in EF Core 1.引言 在使用ORM中(比如Entity Framework)贫血领域模型 ...
- EF Core中DbContext可以被Dispose多次
我们知道,在EF Core中DbContext用完后要记得调用Dispose方法释放资源.但是其实DbContext可以多次调用Dispose方法,虽然只有第一次Dispose会起作用,但是DbCon ...
- 9.翻译系列:EF 6以及EF Core中的数据注解特性(EF 6 Code-First系列)
原文地址:http://www.entityframeworktutorial.net/code-first/dataannotation-in-code-first.aspx EF 6 Code-F ...
随机推荐
- MRCTF Ezpop_Revenge小记
前言 一道typecho1.2的反序列化,顺便记录一下踩的坑 www.zip获得源码,结构大致如下 flag.php需要ssrf,如果成功会写入session 拿到源码直接去网上先找了一下有没有现成的 ...
- Python - Python算法之冒泡算法的超简单实现
[原创]转载请注明作者Johnthegreat和本文链接 冒泡排序在算法中算是最简单也最容易实现的,这里介绍一个非常简单实现的代码: def bubble_sort(ls): for first in ...
- python 规范篇 如何合理使用 assert
assert 的合理使用,可以增加代码的健壮度,同时也方便了程序出错时开发人员的定位排查. 什么是 assert? Python 的 assert 语句,可以说是一个 debug 的好工具,主要用于测 ...
- word2sequence 把字符串转换数字编码
地址:http://ai.stanford.edu/~amaas/data/sentiment/,这是一份包含了5万条流行电影的评论数据,其中训练集25000条,测试集25000条. 1.准备数据 d ...
- php里的闭包函数
一个匿名函数内要获取外部的变量必须要使用use: $message = 'hello'; $example = function() use ($message){ var_dump($message ...
- python学习24之异常
'''''''''1.低级错误:纯语法错误2.中级错误:代码存在隐性错误,逻辑缺陷3.高级错误:软件面对不确定性的异常错误''''''一.捕获异常1.基本异常捕获语句try: #异常捕捉语句的开始 代 ...
- SVN diff
http://svnbook.red-bean.com/en/1.6/svn.ref.svn.c.diff.html Name svn diff (di) — This displays the di ...
- SpringCloud入门(十一):Sleuth 与 Zipkin分布式链路跟踪
现今业界分布式服务跟踪的理论基础主要来自于 Google 的一篇论文<Dapper, a Large-Scale Distributed Systems Tracing Infrastructu ...
- 【Linux常见命令】ifconfig命令:配置与查看网络信息
ifconfig(interfaces config).通常需要以root身份登录或使用sudo来使用ifconfig工具 ifconfig 命令用来查看和配置网络设备.当网络环境发生改变时可通过此命 ...
- Eclipse Mac OS 安装 最新版 Subversion插件subclipse
subclipse 目前全部转移到github 官方地址 https://github.com/subclipse/subclipse/wiki Eclipse mac版 安装 最新版svn插件sub ...