solr functionquery函数查询自定义函数实现
Solr是一个开源的搜索平台,基于Apache Lucene库构建,主要用于提供全文搜索的功能。它被设计为一个高度可靠、可扩展的搜索应用服务器。以下是Solr的一些主要使用场景:
-
全文搜索:Solr最核心的功能是提供全文搜索,它可以对大量文档进行索引,并支持快速、复杂的搜索查询。这对于需要在大量数据中快速找到特定信息的网站或应用程序非常有用。
-
电子商务搜索:在线商店可以使用Solr来提供产品搜索功能,包括过滤、排序、推荐等。Solr可以提高搜索的相关性和性能,从而提升用户体验和销售额。
Solr索引采用倒排索引。倒排索引,也称为反向索引,是一种数据结构,用于存储一个单词在文档中出现的位置。这种结构使得搜索操作能够迅速找到包含特定单词的所有文档。
在Solr中,倒排索引的工作原理可以概括如下:
-
索引创建:当文档被添加到Solr中时,Solr首先对文档进行解析,提取出索引字段中的文本内容。然后,Solr使用分词器(Tokenizer)将文本分解成一系列的词汇单元(Terms),并对这些词汇进行标准化处理(如小写化、同义词扩展等)。
-
词汇映射:处理后的词汇会被映射到一个内部的唯一标识符(Term ID)。同时,Solr会记录每个词汇出现的所有文档列表。
-
倒排列表:Solr构建了一个倒排列表,其中每个唯一的词汇都是一个索引项,指向包含该词汇的所有文档的列表。这个列表通常被称为文档ID的集合。
-
查询处理:当用户发起搜索请求时,Solr会解析查询语句,找到所有匹配的词汇,并使用倒排列表快速定位到这些词汇出现的文档集合。
-
结果合并:Solr会根据查询的复杂性(如使用布尔运算符、范围查询等)合并这些文档集合,然后根据相关性排序算法对结果进行排序,最后返回给用户。
Solr的Function Query(函数查询)是一种强大的查询机制,它允许用户在搜索时执行复杂的计算和操作。Function Queries可以对字段值进行实时的数学、统计或其他类型的函数计算,然后将结果用于过滤、排序或影响查询的相关性得分。
根据搜索结果中提供的信息,以下是对Solr Function Query的一些介绍:
-
使用方式:Function Queries可以通过明确的QParser使用,例如
func或frange。例如,q={!func}div(popularity,price)和fq={!frange l=1000}customer_ratings这样的查询表达式。 -
在Sort表达式中使用:Function Queries也可以在排序表达式中使用,例如
sort=div(popularity,price) desc, score desc,这将首先根据popularity除以price的结果降序排序,然后根据得分进行降序排序。 -
函数查询的类型:Solr支持多种内置函数,包括数学函数(如加法、减法、乘法、除法)、统计函数(如平均值、最大值、最小值)、文本函数(如长度、包含)等。
-
动态计算:Function Queries可以在查询时动态计算字段值,这使得可以根据实时数据进行搜索,而不是依赖于索引时的静态值。
solr的字符串函数比较缺乏,只有strdist 字符串距离,即字符串相关性。termfreq 字符串文档出现次数。连contain 即是否包含某个字符串,length字符串长度、concat字符串拼接等几个常用的字符串操作都没有实现,使用起来很不方便。比如某个文档中有个标签字段,该标签字段存放着多个标签以逗号隔开的字符串,这时如果想查满足条件的商品 同时带动漫标签的商品排序居前,发现没法满足需求。这时需要实现contain的自定义函数。下面以contain为例
-
编写自定义函数类:
- 创建一个新的Java类,该类实现
org.apache.lucene.queries.function.ValueSource接口。 - 在类中实现
getValue(int doc)方法,该方法定义了如何为每个文档计算函数值。 - 如果需要,还可以实现其他方法,如
getDefaultValue()、createWeight(IndexSearcher searcher)等。 - 创建一个新的Java类,该类实现
org.apache.solr.search.ValueSourceParser接口。
- 创建一个新的Java类,该类实现
-
编译并打包:
- 将编写的自定义函数类编译成
.class文件。 - 将
.class文件打包到一个JAR文件中。
- 将编写的自定义函数类编译成
-
在
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是你的自定义函数类的全限定名。
- 在
-
在查询中使用自定义函数:
- 在Solr查询中,你可以通过
funcQParser来使用自定义函数,例如:q={!func}contain(field,'动漫')。 - 你也可以在排序或过滤中使用自定义函数,例如:
sort=contain(field,'动漫') asc或fq={!frange l=0}contain(field,'动漫')。
- 在Solr查询中,你可以通过
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;}};}
重启后测试效果可以了
相关文章:
solr functionquery函数查询自定义函数实现
Solr是一个开源的搜索平台,基于Apache Lucene库构建,主要用于提供全文搜索的功能。它被设计为一个高度可靠、可扩展的搜索应用服务器。以下是Solr的一些主要使用场景: 全文搜索:Solr最核心的功能是提供全文搜索,它可以…...
如何将 Parallels虚拟机 安装或者迁移到 移动硬盘 or U盘?
本文讨论主题 如何安装 Parallels 虚拟机到移动硬盘和U盘? 已经安装到了mac上的虚拟机如何迁移到移动硬盘活着U盘上? 关于Parallels Deskshop 19 虚拟机 安装激活,文末关注公众号AIshape,回复:PD 进行获取通过将虚拟机安装在外置的移动硬盘U盘上,可以节省mac本身SSD的容…...
大型网站集群管理负载均衡
课程介绍 结合企业大规模应用,解决应用高并发问题,解决单节点故障问题,缓存数据库的应用。学完掌握知识点:企业应用实现四七层负载均衡,以及Nginx等应用的高可用性,Redis缓存数据库的部署应用以及高可用方…...
JAVA使用POI实现Excel单元格合并-02
JAVA使用POI实现Excel单元格合并 实现效果 解释:只要是遇见与前一行相同的数据就合并 引入jar <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.2</version></depe…...
深入了解 Linux 中的 MTD 设备:/dev/mtd* 与 /dev/mtdblock*
目录 前言一、什么是MTD子系统?二、 /dev/mtd* 设备文件用途注意事项 三、/dev/mtdblock* 设备文件用途注意事项 三、这两种设备文件的关系四、关norflash的一些小知识 前言 在嵌入式Linux系统的世界里,非易失性存储技术扮演着至关重要的角色。MTD&#…...
2、Spring CLI安装
安装 Spring CLI 提供了多种格式,让您选择自己喜欢的安装方法。可下载的制品可从发布页面获取。 二进制发行版 WindowsLinuxMac手动安装(Windows,其他自己看) spring-cli-standalone-<version>-windows.x86_64.zip - 打包了 x86 JDKspring-cli-installer-<versi…...
数据库备份工具(实现数据定时覆盖)
数据库备份工具(实现数据定时覆盖) 永远热爱,永远执着! 工具介绍 自动化测试数据库更新调度程序 这段 Python 脚本自动化了每天定时从生产数据库更新测试数据库的过程。它利用了 schedule 库来安排并执行每天指定时间的更新任务…...
测试环境搭建整套大数据系统(十二:挂载磁盘到hadoop环境)
一:链接硬盘 将硬盘连接到计算机的 SATA 接口或 USB 接口,并确保硬盘通电并处于可用状态。 二:查看硬盘信息 sudo fdisk -l三:创建分区 gdisk /dev/vbd重新扫描磁盘 partprobe /dev/vdb格式化磁盘 mkfs.ext4 /dev/vdb2查看磁…...
Spring事务核心:声明式事务注解式事务
全解:声明式事务和注解事务 在Spring中,事务管理是一个非常重要的特性,它可以帮助开发者在应用程序中实现事务控制。Spring提供了两种事务管理方式:声明式事务和注解事务。 1. 声明式事务 声明式事务是指通过配置文件或注解的方…...
AcWing 1015. 摘花生
Problem: AcWing 1015. 摘花生 文章目录 思路解题方法复杂度Code 思路 这是一个典型的动态规划问题。我们需要在一个二维网格中,从左上角走到右下角,每次只能向右或向下移动,目标是使得经过的路径上的数字之和最大。 我们可以定义dp[i][j]为从…...
Dalle-3、Sora、Stable Diffusion 3 掀起AIGC新浪潮
随着科技的飞速发展,我们迎来了视觉AIGC高光时刻,一个充满无限可能与机遇的新时代。在这个时代里,三大里程碑Dalle-3、Sora和Stable Diffusion 3以其炸裂式的技术发展,引领着AIGC领域的新浪潮。文章首先做相应简要介绍,…...
Unity 视频组件 VideoPlayer
组件添加: 在自己定义的组件下(例如:Panel) 点击 Inspector 面板中的 AddComponent ,输入“VideoPlayer”。 资源 这里 视频资源有两种形式,第一种是 VideoClip ,需要将视频文件拖拽到该属性字段…...
RSTP环路避免实验(华为)
思科设备参考:RSTP环路避免实验(思科) 一,技术简介 RSTP (Rapid Spanning Tree Protocol) 是从STP发展而来 • RSTP标准版本为IEEE802.1w • RSTP具备STP的所有功能,可以兼容STP运行 • RSTP和STP有所不同 减少了…...
Arduino IDE工程代码多文件编程和中文设置
一、esp8266模块信息 二、中英文切换 点击文件( File )–选择首选项( Preference )—选择语言( Language )—选择中文–点击确定( OK ) 三、多文件编程 在Arduino编程中,将代码分割成多个文件是一种很好的做法,特别是项目变得越来越大和复杂时。这样…...
【微服务】Eureka(服务注册,服务发现)
文章目录 1.基本介绍1.学前说明2.当前架构分析1.示意图2.问题分析 3.引出Eureka1.项目架构分析2.上图解读 2.创建单机版的Eureka1.创建 e-commerce-eureka-server-9001 子模块2.检查父子pom.xml1.子 pom.xml2.父 pom.xml 3.pom.xml 引入依赖4.application.yml 配置eureka服务5.…...
windows上ssh设置代理,直接访问公司内网
ssh设置代理一般来说很简单,对于无密码或者可以支持密钥登录的,都比较无脑 难的地方在于使用用户名密码认证来使用一个http的代理或者socks5的代理,密码如何设置?特殊字符如何处理? 直接上答案,.ssh/conf…...
C++ union用法
在C中,union是一种特殊的数据类型,可以在同一个内存位置存储不同的数据类型。它的用法如下: 1. 声明union类型:使用关键字union加上union名称来声明一个union类型。 c union UnionName { dataType1 member1; dataType2 …...
JavaSE_运算符 案例分析
/*符号在字符串中的操作: 表示连接,会将其他内容和字符串连接在一起,形成一个字符串目标:理解符号在字符串中的作用会将其他内容和字符串连接在一起,形成一个字符串*/ public class Operator03 {public static void main(String[] args) {System.out.println("5 5 "…...
15、Spring Cloud Alibaba Sentinel实现熔断与限流
注:本篇文章主要参考周阳老师讲解的cloud进行整理的! 1、Sentinel 1.1、官网 https://sentinelguard.io/zh-cn/ 等价对标 Spring Cloud Circuit Breaker 1.2、是什么 https://github.com/alibaba/Sentinel/wiki 1.3、去哪下 https://github.com/alibab…...
Linux logout命令教程:如何安全地退出Linux会话(附实例详解和注意事项)
Linux logout命令介绍 logout命令用于退出当前的登录Shell。这个命令可以被普通用户用来结束他们自己的会话。 Linux logout命令适用的Linux版本 logout命令在所有主流的Linux发行版中都是可用的,包括但不限于Debian、Ubuntu、Alpine、Arch Linux、Kali Linux、R…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
