solr functionquery函数查询自定义函数实现

Solr是一个开源的搜索平台,基于Apache Lucene库构建,主要用于提供全文搜索的功能。它被设计为一个高度可靠、可扩展的搜索应用服务器。以下是Solr的一些主要使用场景:

  1. 全文搜索:Solr最核心的功能是提供全文搜索,它可以对大量文档进行索引,并支持快速、复杂的搜索查询。这对于需要在大量数据中快速找到特定信息的网站或应用程序非常有用。

  2. 电子商务搜索:在线商店可以使用Solr来提供产品搜索功能,包括过滤、排序、推荐等。Solr可以提高搜索的相关性和性能,从而提升用户体验和销售额。

Solr索引采用倒排索引。倒排索引,也称为反向索引,是一种数据结构,用于存储一个单词在文档中出现的位置。这种结构使得搜索操作能够迅速找到包含特定单词的所有文档。

在Solr中,倒排索引的工作原理可以概括如下:

  1. 索引创建:当文档被添加到Solr中时,Solr首先对文档进行解析,提取出索引字段中的文本内容。然后,Solr使用分词器(Tokenizer)将文本分解成一系列的词汇单元(Terms),并对这些词汇进行标准化处理(如小写化、同义词扩展等)。

  2. 词汇映射:处理后的词汇会被映射到一个内部的唯一标识符(Term ID)。同时,Solr会记录每个词汇出现的所有文档列表。

  3. 倒排列表:Solr构建了一个倒排列表,其中每个唯一的词汇都是一个索引项,指向包含该词汇的所有文档的列表。这个列表通常被称为文档ID的集合。

  4. 查询处理:当用户发起搜索请求时,Solr会解析查询语句,找到所有匹配的词汇,并使用倒排列表快速定位到这些词汇出现的文档集合。

  5. 结果合并:Solr会根据查询的复杂性(如使用布尔运算符、范围查询等)合并这些文档集合,然后根据相关性排序算法对结果进行排序,最后返回给用户。

Solr的Function Query(函数查询)是一种强大的查询机制,它允许用户在搜索时执行复杂的计算和操作。Function Queries可以对字段值进行实时的数学、统计或其他类型的函数计算,然后将结果用于过滤、排序或影响查询的相关性得分。

根据搜索结果中提供的信息,以下是对Solr Function Query的一些介绍:

  1. 使用方式:Function Queries可以通过明确的QParser使用,例如funcfrange。例如,q={!func}div(popularity,price)fq={!frange l=1000}customer_ratings这样的查询表达式。

  2. 在Sort表达式中使用:Function Queries也可以在排序表达式中使用,例如sort=div(popularity,price) desc, score desc,这将首先根据popularity除以price的结果降序排序,然后根据得分进行降序排序。

  3. 函数查询的类型:Solr支持多种内置函数,包括数学函数(如加法、减法、乘法、除法)、统计函数(如平均值、最大值、最小值)、文本函数(如长度、包含)等。

  4. 动态计算:Function Queries可以在查询时动态计算字段值,这使得可以根据实时数据进行搜索,而不是依赖于索引时的静态值。

solr的字符串函数比较缺乏,只有strdist 字符串距离,即字符串相关性。termfreq 字符串文档出现次数。连contain 即是否包含某个字符串,length字符串长度、concat字符串拼接等几个常用的字符串操作都没有实现,使用起来很不方便。比如某个文档中有个标签字段,该标签字段存放着多个标签以逗号隔开的字符串,这时如果想查满足条件的商品 同时带动漫标签的商品排序居前,发现没法满足需求。这时需要实现contain的自定义函数。下面以contain为例

  1. 编写自定义函数类

    • 创建一个新的Java类,该类实现org.apache.lucene.queries.function.ValueSource接口。
    • 在类中实现getValue(int doc)方法,该方法定义了如何为每个文档计算函数值。
    • 如果需要,还可以实现其他方法,如getDefaultValue()createWeight(IndexSearcher searcher)等。
    • 创建一个新的Java类,该类实现org.apache.solr.search.ValueSourceParser接口。
  2. 编译并打包

    • 将编写的自定义函数类编译成.class文件。
    • .class文件打包到一个JAR文件中。
  3. solrconfig.xml中注册函数

    • solrconfig.xml文件的<config>标签内,添加一个<queryResponseWriter type="velocity" />配置,以便能够使用Velocity模板。
    • <config>标签内,添加<lib dir="lib" regex=".*\.jar"/>来包含你的自定义函数JAR文件。
    • 使用<valueSourceParser name="contain" class="your.package.MyCustomFunction"/>来注册你的自定义函数,其中myfunc是你在查询中使用的名称,your.package.MyCustomFunction是你的自定义函数类的全限定名。
  4. 在查询中使用自定义函数

    • 在Solr查询中,你可以通过func QParser来使用自定义函数,例如:q={!func}contain(field,'动漫')
    • 你也可以在排序或过滤中使用自定义函数,例如:sort=contain(field,'动漫') ascfq={!frange l=0}contain(field,'动漫')
public FunctionValues getValues(Map arg0, AtomicReaderContext arg1) throws IOException {final FunctionValues v1 = field.getValues(arg0, arg1);final FunctionValues v2 = val.getValues(arg0, arg1);return new IntDocValues(this) {@Overridepublic int intVal(int arg0) {if(null==v1.strVal(arg0)) return 0;if(null==v2.strVal(arg0)) return 0;if( v1.strVal(arg0).contains(v2.strVal(arg0))) return 1;else return 0;}};}

重启后测试效果可以了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/770434.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2.6 IDE(集成开发环境)是什么

IDE&#xff08;集成开发环境&#xff09;是什么 IDE 是 Integrated Development Environment 的缩写&#xff0c;中文称为集成开发环境&#xff0c;用来表示辅助程序员开发的应用软件&#xff0c;是它们的一个总称。 通过前面章节的学习我们知道&#xff0c;运行 C 语言&…

eclipse导入svn项目

1、配置maven 2、用svn引入项目 3一直点击next,到最后选完成。

基于springboot的房屋租赁管理系统+数据库+免费远程调试

项目介绍: 基于springboot的房屋租赁管理系统。Javaee项目&#xff0c;springboot项目&#xff0c;采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring SpringBoot JspMaven来实现。MyS…

Qt_day4:2024/3/25

作业1&#xff1a; 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和…

关于docker-Engine使用的存储驱动devicemapper的常识

缘起&#xff1a; 今天值班的兄弟找我说PAAS节点扩容后有个 docker-container 创建一直失败&#xff0c;看不懂输出的报文信息。 看值班给出的投屏发现和storage-driver有关&#xff0c;提示信息如下&#xff1a; Error running DeviceCreate (createSnapDevice) dm_task_ru…

STM32IAP技术

STM32IAP技术 内存 1、程序存储在0x0800 0000。 2、程序从0x0000 0000开始执行。 3、0x0000 0000和0x0800 0000 相互映射。 4、厂商自带的Bootloader存在系统存储区。地址为0x1FFF F000 5、不同容量单片机闪存大小不同&#xff0c;对于主存储闪存容量不多于512KB的GD32F30x_C…

MongoDB聚合运算符:$isArray

文章目录 语法使用举例 $isArray聚合运算符返回操作数是否是一个数组&#xff0c;返回一个布尔值。 语法 { $isArray: [ <expression> ] }使用 <expression>为任何类型的表达式&#xff0c;举例说明&#xff1a; 举例结果说明{ $isArray: "hello" }f…

【iOS ARKit】播放3D音频

3D音频 在前面系列中&#xff0c;我们了解如何定位追踪用户&#xff08;实际是定位用户的移动设备&#xff09;的位置与方向&#xff0c;然后通过摄像机的投影矩阵将虚拟物体投影到用户移动设备屏幕。如果用户移动了&#xff0c;则通过VIO 和 IMU更新用户的位置与方向信息&…

钡铼技术R40路由器助力构建无人值守的智能化污水处理厂

钡铼技术R40路由器作为智能化污水处理厂的关键网络设备&#xff0c;发挥着至关重要的作用&#xff0c;助力构建无人值守的智能化污水处理系统。在现代社会&#xff0c;污水处理是城市环境保护和可持续发展的重要组成部分&#xff0c;而智能化污水处理厂借助先进的技术和设备&am…

后端常问面经之Java基础

基本数据类型 Java中有8种基本数据类型&#xff1a; 6种数字类型&#xff1a; 4种整数型&#xff1a;byte、short、int、long 2种浮点型&#xff1a;float、double 1种字符类型&#xff1a;char 1种布尔类型&#xff1a;boolean 数据类型的默认值以及所占空间如下&#x…

由浅到深认识Java语言(25):正则表达式

该文章Github地址&#xff1a;https://github.com/AntonyCheng/java-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.c…

docker简单使用1

docker简单使用1 1. 执行dockerfile 1. 执行dockerfile 要执行 Docker 脚本&#xff0c;首先需要确保你已经安装了 Docker 并且启动了 Docker 服务。接下来&#xff0c;按照以下步骤执行 Docker 脚本&#xff1a; 将 Docker 脚本保存为一个名为 Dockerfile 的文本文件&#xf…

2024 Python3.10 系统入门+进阶(三):Python变量类型和运算符

目录 一、Python变量的定义和使用二、Python整数类型&#xff08;int&#xff09;详解三、Python小数/浮点数&#xff08;float&#xff09;类型详解四、Python复数类型(complex)详解---了解五、Python字符串详解(包含长字符串和原始字符串)5.1 处理字符串中的引号5.2 字符串的…

后端常见面经之JVM

JVM组成 有垃圾回收的是哪些地方&#xff1f; 垃圾回收主要是针对堆内存中的对象进行的&#xff0c;包括以下几个方面&#xff1a; 堆内存&#xff1a;垃圾回收主要针对堆内存中不再被引用的对象进行回收&#xff0c;包括新生代和老年代中的对象。 永久代/元空间&#xff1a…

Selenium 自动化 —— 切换浏览器窗口

更多内容请关注我的 Selenium 自动化 专栏&#xff1a; 入门和 Hello World 实例使用WebDriverManager自动下载驱动Selenium IDE录制、回放、导出Java源码浏览器窗口操作 平时我们在使用浏览器时&#xff0c;通常会打开多个窗口&#xff0c;然后再多个窗口中来回切换&#xf…

众邦科技CRMEB商城商业版任意文件写入getshell 0day

代码审计 接口&#xff1a;/adminapi/system/crud 处理的代码如下 public function save(SystemCrudDataService $service, $id 0){$data $this->request->postMore([[pid, 0],//上级菜单id[menuName, ],//菜单名[tableName, ],//表名[modelName, ],//模块名称[table…

手机网页视频无水印采集工具|抖音视频关键词批量下载软件

轻松获取手机网页视频无水印的神器&#xff01;让您随心所欲畅享精彩视频内容&#xff01; 随着网络视频的盛行&#xff0c;如何方便快捷地获取您感兴趣的视频内容成为一大需求。现推出一款手机网页视频无水印采集工具&#xff0c;功能强大&#xff0c;操作简便&#xff0c;助您…

[项目前置]如何用webbench进行压力测试

测试软件 采用webbench进行服务器性能测试。 Webbench是知名的网站压力测试工具&#xff0c;它是由Lionbridge公司开发。 webbench的标准测试可以向我们展示服务器的两项内容&#xff1a; 每秒钟相应请求数 和 每秒钟传输数据量 webbench测试原理是&#xff0c;创建指定数…

03-CSS盒模型(padding、margin、opactiy、cursor、display、css3前缀)

一、CSS盒模型 CSS 盒模型规定了处理元素内容、内边距、边框 和 外边距 的方式。最内部分是元素内容&#xff0c;直接包围内容的是内边距。内边距呈现了元素的背景。内边距的边缘是边框。边框以外是外边距。 1.元素的尺寸: height 设置元素的高度。属性值&#xff1a;auto&am…

开源流程图表库(01):Mermaid.js生成流程图、时序图、甘特图等

一、Mermaid.js的特点 Mermaid.js是一个用于生成流程图、时序图、甘特图等各种图表的开源库。它使用简洁的文本语法来描述图表结构&#xff0c;并将其转换为可视化的图形。 Mermaid.js的主要特点包括&#xff1a; 简洁易用&#xff1a;Mermaid.js使用简单的文本语法来描述图表…