solr 模糊匹配_Solr中的前缀和后缀匹配

solr 模糊匹配

搜索引擎都是关于查找字符串的。 用户输入一个查询词,然后从反向索引中检索它。 有时,用户正在寻找的值只是索引中值的子字符串,并且用户可能也对这些匹配感兴趣。 对于德语这样的包含复合词(如Semmelknödel)的语言,这尤其重要,其中Knödel表示饺子,而Semmel专门针对这种词。

通配符

为了演示方法,我使用了非常简单的模式。 文档由一个文本字段和一个ID组成。 Github上也可以进行配置和单元测试。

<fields><field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /><field name="text" type="text_general" indexed="true" stored="false"/>
</fields>
<uniqueKey>id</uniqueKey>
<types><fieldType name="string" class="solr.StrField" sortMissingLast="true" /><fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"><analyzer><tokenizer class="solr.StandardTokenizerFactory"/><filter class="solr.LowerCaseFilterFactory"/></analyzer></fieldType>
</types>

在进行前缀或后缀匹配时非常流行的一种方法是在查询时使用通配符。 这可以通过编程方式完成,但是您需要注意,然后正确转义任何用户输入。 假设您在索引中包含术语饺子 ,并且用户输入了术语dump 。 如果要确保查询词与索引中的文档匹配,您可以在应用程序代码中向用户查询添加通配符,以便将生成的查询转储为*

通常,在执行此类过多操作时应格外小心:如果用户实际上正在寻找包含dump单词的文档,那么她可能对包含饺子的文档不感兴趣。 您需要自己决定是只希望对用户感兴趣的匹配项(精确)还是向用户显示尽可能多的可能匹配项(调用)。 这在很大程度上取决于您的应用程序的用例。

您可以通过提高与您的学期的完全匹配来增加用户体验。 您需要创建一个更复杂的查询,但是这样,包含完全匹配项的文档将获得更高的分数:

dump^2 OR dump*

在创建这样的查询时,您还应注意用户不能添加会使查询无效的字词。 escapeQueryChars类的SolrJ方法escapeQueryChars可用于转义用户输入。

如果现在考虑后缀匹配,则查询可能会变得相当复杂,并且在客户端创建这样的查询并不适合每个人。 根据您的应用程序,另一种方法可能是更好的解决方案:您可以在索引期间创建另一个包含NGram的字段。

前缀与NGrams匹配

NGrams是索引术语的子字符串,您可以将其放在其他字段中。 这些子字符串可用于查找,因此不需要任何通配符。 使用(e)dismax处理程序,您可以在字段上自动设置用于完全匹配的提升,从而获得与上述相同的行为。

对于前缀匹配,我们可以使用为其他字段配置的EdgeNGramFilter :

...<field name="text_prefix" type="text_prefix" indexed="true" stored="false"/>
...<copyField source="text" dest="text_prefix"/>
...    <fieldType name="text_prefix" class="solr.TextField" positionIncrementGap="100"><analyzer type="index"><tokenizer class="solr.LowerCaseTokenizerFactory"/><filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15" side="front"/></analyzer><analyzer type="query"><tokenizer class="solr.LowerCaseTokenizerFactory"/></analyzer></fieldType>

在索引期间,文本字段值将复制到text_prefix字段,并使用EdgeNGramFilter进行分析。 从字符串的开头开始,将为3到15之间的任何长度创建克。 当为术语饺子建立索引时,它将是:

  • 哑巴
  • 倾倒
  • 垃圾堆
  • 杜普利
  • 杜普林
  • 饺子

在查询期间,该词不会再次拆分,因此可以使用与子字符串完全匹配的词。 与往常一样,Solr管理员后端的分析视图对于查看实际的分析过程可能会很有帮助。

分析

现在,您可以使用dismax处理程序按原样传递用户查询,并通过添加参数qf=text^2,text_prefix来建议它在您的字段中进行搜索。

后缀匹配

对于具有复合词的语言,通常也需要进行后缀匹配。 如果用户查询术语Knödel (水饺),则包含术语Semmelknödel的文档也应匹配。

使用Solr版本高达4.3,这没问题。 您可以使用EdgeNGramFilterFactory从字符串的后面开始创建克。

...<field name="text_suffix" type="text_suffix" indexed="true" stored="false"/>
...    <copyField source="text" dest="text_suffix"/>
...<fieldType name="text_suffix" class="solr.TextField" positionIncrementGap="100"><analyzer type="index"><tokenizer class="solr.StandardTokenizerFactory"/><filter class="solr.LowerCaseFilterFactory"/><filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15" side="back"/></analyzer><analyzer type="query"><tokenizer class="solr.KeywordTokenizerFactory"/><filter class="solr.LowerCaseFilterFactory"/></analyzer></fieldType>
...

这将创建索引词的后缀,其中也包含词knödel,因此我们的查询有效。

但是,使用较新版本的Solr时,在建立索引期间会遇到问题:

java.lang.IllegalArgumentException: Side.BACK is not supported anymore as of Lucene 4.4, use ReverseStringFilter up-front and afterwardat org.apache.lucene.analysis.ngram.EdgeNGramTokenFilter.(EdgeNGramTokenFilter.java:114)at org.apache.lucene.analysis.ngram.EdgeNGramTokenFilter.(EdgeNGramTokenFilter.java:149)at org.apache.lucene.analysis.ngram.EdgeNGramFilterFactory.create(EdgeNGramFilterFactory.java:52)at org.apache.lucene.analysis.ngram.EdgeNGramFilterFactory.create(EdgeNGramFilterFactory.java:34)

您不能再将EdgeNGramFilterFactory用作后缀ngram。 但是幸运的是,堆栈跟踪还建议我们如何解决此问题。 我们必须将其与ReverseStringFilter结合使用:

<fieldType name="text_suffix" class="solr.TextField" positionIncrementGap="100"><analyzer type="index"><tokenizer class="solr.LowerCaseTokenizerFactory"/><filter class="solr.ReverseStringFilterFactory"/><filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15" side="front"/><filter class="solr.ReverseStringFilterFactory"/></analyzer><analyzer type="query"><tokenizer class="solr.LowerCaseTokenizerFactory"/></analyzer>
</fieldType>

现在这将产生与以前相同的结果。

结论

是否要通过添加通配符来处理查询,或者是否应该使用NGram方法,在很大程度上取决于您的用例,也取决于您的口味。 我个人大部分时间都在使用NGrams,因为磁盘空间通常与我正在从事的项目无关。 Lucene 4中的通配符搜索变得更快了,所以我怀疑那里是否还有真正的好处。 不过,我倾向于在索引期间进行尽可能多的处理。

翻译自: https://www.javacodegeeks.com/2014/05/prefix-and-suffix-matches-in-solr.html

solr 模糊匹配

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

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

相关文章

视频编解码器常见问题介绍

视频编解码器&#xff0c;是指一个能够对数字视频进行压缩或者解压缩的程序或者设备。通常这种压缩属于有损数据压缩。历史上&#xff0c;视频信号是以模拟形式存储在磁带上的。那么&#xff0c;我们在使用视频编解码器的过程中遇到的一些常见问题有哪些呢&#xff1f;接下来我…

Java中的双重检查锁定

在本文中&#xff0c;我们将介绍在RxJava中创建Singleton对象的一些技术。 最重要的是&#xff0c;我们将学习Java中的双重检查锁定 。 Java中的Singleton模式是一种创新模式。 随着时间的流逝&#xff0c;人们开始关注Singleton模式的使用和实现。 这是由于单例的实现和使用方…

视频干扰的原因及解决方法

我们在视频监控和视频传输会议中常常会遇到视频信号被干扰的困扰&#xff0c;由于视频干扰产生画面抖动、显示模糊等显示问题&#xff0c;严重影响使用效果。那么这些干扰信号时如何产生的&#xff0c;又该如何解决呢&#xff1f;接下来我们就跟随飞畅科技的小编一起来详细了解…

网络监控系统安装的4种方式,安防必备

现如今&#xff0c;随着人们安防意识的提高&#xff0c;监控从业人员也越来越多。对于刚刚加入这个行业的新人来讲&#xff0c;可能首先要从最基层的监控设备安装做起。只有在实践中不断积累经验技术&#xff0c;才有可能独当一面、快速成长。作为一名新手&#xff0c;网络监控…

it编年史_Java的编年史和低延迟

it编年史总览 我正在看Typesafe的Rolan Kuhn在介绍React流方面的精彩演讲&#xff0c;乍一看似乎与《纪事报》有一些相似的目标&#xff0c;但是当您深入研究细节时&#xff0c;很明显我有一些关键的假设根本不同。 关键假设 《纪事》设计的主要假设是 低延迟是您的问题&#…

智慧磐石工程项目系统组成

武警部队智慧磐石工程以五防一体化建设为基础&#xff0c;融入各类前沿智能检测、识别、控制等相关技术&#xff0c;通过整合指挥、监控、防护、报警、通信、处置要素&#xff0c;实现信息智能管理、环境智能分析、通道智能防范、监控智能识别、险情智能感知、枪弹智能管控、情…

网络延长器分为哪几类?其应用领域有哪些?

网络延长器具有超低传输时延&#xff0c;能够线速转发数据包。网络延长器采用自主产权的LRE&#xff08;Long- Reacher Ethernet&#xff09;长线以太网驱动技术&#xff0c;能有效延长以太网传输距离达700米&#xff0c;同时保障最大传输带宽。基本原理是通过信号整形放大&…

Java项目:书评

本文是关于这本书的 Peter Verhas撰写的Java Projects Second Edition 我去年写的 这样一篇文章的目的通常是为了促进这本书的销售。 在这种情况下没有什么不同&#xff0c;但是由于这是我写的书&#xff0c;而且我是撰写评论的人&#xff0c;因此赞美这本书将非常尴尬。 所以…

信号延长器常见故障问题及解决方案汇总

延长器是用来延长信号的器件&#xff0c;通常用于长距离直连线材无法满足传输要求的情况&#xff0c;一般是为了确保信号长距离无衰减的传输而设计&#xff0c;因此多是有源的。我们在使用信号延长器的过程中难免会遇到各种各样的故障问题&#xff0c;那么我们该如何解决呢&…

一文读懂视频监控系统全过程内容

视频监控系统由实时控制系统、监视系统及管理信息系统组成。视频监控系统是安全防范系统的组成部分&#xff0c;它是一种防范能力较强的综合系统。视频监控以其直观、方便、信息内容丰富而广泛应用于许多场合。接下来就由飞畅科技来为大家详细介绍下视频监控系统的全过程&#…

以太网识别标准及接线标准、接线方法详解

以太网是目前应用最普遍的局域网技术&#xff0c;取代了其他局域网技术如令牌环、FDDI和ARCNET。为了使网络系统中的软硬件设备不受生产厂家和型号等不同的限制&#xff0c;制定了各种各样的标准来保证他们之间的相互通&#xff0c;以太网标准就是其中之一&#xff0c;IEEE组织…

Spring Framework中的作用域代理

Spring框架提供了Spring bean的作用域。 我们可以使用spring范围控制插入Spring bean的各种依赖关系和配置值。 Spring支持以下六个范围。 在基于Web的应用程序中可以使用六个中的四个&#xff1a; 范围 描述 辛格尔顿 它是Spring框架中的默认范围。 对于每个Spring IOC容…

中继器、集线器、网桥、网关产品介绍

在了解通信原理之前&#xff0c;我们首先要对通信常用的设备进行熟悉&#xff0c;计算机网络体系中&#xff0c;有几样通信设备或者说网络名词出现的频率相当高&#xff0c;它们是&#xff1a;中继器、集线器、网桥、交换机、路由器和网关。其实&#xff0c;弄清楚这几个计算机…

串口转换器的工作方式及通讯模式介绍

串口转换器能让您在配有RS-232的系统上使用RS-422及RS-485。它透明地将RS-232信号转成隔离的RS-422或RS-485信号。对此&#xff0c;您无需改变PC机任何的硬件或软件就能让您利用标准的PC硬件&#xff0c;来轻松构建一个工业级的长距离通信系统&#xff1b;基于TCP/IP和RS-485/4…

java8根据某个id删选_Java 8可选:如何使用它

java8根据某个id删选Java 8带有新的Optional类型&#xff0c;类似于其他语言中可用的类型。 这篇文章将介绍这种新类型的使用方式&#xff0c;即主要用途。 什么是可选类型&#xff1f; 可选的是新容器类型&#xff0c;如果有可用值&#xff0c;则该容器类型将包装单个值。 因…

Java中的瞬态关键字及其使用

最近&#xff0c;我在一个朋友的一个研究项目中遇到了十字架&#xff0c;他们正在学习Java编程的基础知识&#xff0c;一些忘记的敏感信息打印在文本文件中&#xff0c;并记住了Java中的瞬时关键字。 Java中的瞬时关键字在安全性方面起着重要作用&#xff0c;并且在上述类似的…

RS-232/E1协议转换器产品介绍

RS-232/E1协议转换器是我公司自主研发生产的高性能产品&#xff0c;它将透明E1转换为V.35或者RS232的异步数据接口的接口转换设备&#xff0c;本设备V.35接口可以连接DCE或DTE两种工作方式的设备&#xff0c;RS232接口只支持异步RS232数据&#xff0c;可支持的最高异步速率为11…

java ee cdi_Java EE CDI限定词:快速浏览

java ee cdi在上下文和依赖注入&#xff08;CDI&#xff09;中&#xff0c; 限定符是类型安全和松散耦合的主体。 为什么&#xff1f; 没有CDI&#xff0c;我们将以类似于下面的方式注入Java EE组件 注意&#xff1a;这实际上不会编译&#xff0c;只是假设的代码片段 例子1 …

什么是串口协议转换器?串口转换器有哪些特点?

串口转换器是为RS-232/485/422到TCP/IP之间完成数据转换的通讯接口转换器。通过作为服务器端&#xff0c;提供RS-232/485/422终端串口与TCP/IP网络的数据双向透明传输&#xff0c;提供串口转网络功能&#xff0c;RS-232/485/422转网络的解决方案&#xff0c;可以让串口设备立即…

485转232转换器产品介绍及性能参数介绍

配有不同标准串行接口的计算机、外部设备或智能仪器之间进行远程数据通信&#xff0c;需要进行标准串行接口的相互转换。485转换器将单端的RS-232信号转换为平衡差分的RS-485或RS-422信号。RS-485、RS-422自动识别功能&#xff0c;使用更加简单。接下来我们就来为大家详细介绍下…