首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >用lucene实现模糊搜索

用lucene实现模糊搜索
EN

Stack Overflow用户
提问于 2013-07-19 12:49:25
回答 1查看 15.3K关注 0票数 8

我用lucene 4.3.1实现了一个模糊搜索,但我对结果不满意。我想指定一些它应该返回的结果。例如,如果我想要10个结果,它应该返回10个最佳匹配,无论它们有多糟糕。大多数情况下,如果我搜索的单词与索引中的任何单词都非常不同,它就不会返回任何内容。如何才能获得更多/更模糊的结果?

下面是我的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public String[] luceneQuery(String query, int numberOfHits, String path)
        throws ParseException, IOException {

    File dir = new File(path);
    Directory index = FSDirectory.open(dir);

    query = query + "~";
    Query q = new QueryParser(Version.LUCENE_43, "label", analyzer)
            .parse(query);

    IndexReader reader = DirectoryReader.open(index);
    IndexSearcher searcher = new IndexSearcher(reader);

    Query fuzzyQuery = new FuzzyQuery(new Term("label", query), 2);

    ScoreDoc[] fuzzyHits = searcher.search(fuzzyQuery, numberOfHits).scoreDocs;
    String[] fuzzyResults = new String[fuzzyHits.length];

    for (int i = 0; i < fuzzyHits.length; ++i) {
        int docId = fuzzyHits[i].doc;
        Document d = searcher.doc(docId);
        fuzzyResults[i] = d.get("label");
    }

    reader.close();
    return fuzzyResults;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-19 16:01:02

在Lucene 4.x中,FuzzyQuery不再支持大的编辑距离。目前的FuzzyQuery实现是在性能上的巨大改进,相比于Lucene3.x实现,但只支持两个编辑。超过2个Damerau-Levenshtein编辑的距离被认为很少是真正有用的。

根据FuzzyQuery documentation的说法,如果你真的需要更高的编辑距离:

如果您真的想要这样做,请考虑使用n元语法索引技术(例如

模块中的SpellChecker )。

强烈的暗示是,你应该重新考虑你试图实现的目标,并找到一种更有用的方法。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17746476

复制
相关文章
[C&C++]C语言字节对齐#pragma pack()
原文链接:https://blog.csdn.net/humanking7/article/details/80979517
祥知道
2020/03/10
1.6K0
#pragma region、{}
定义一个region,这个region内部的代码你可以把它折叠起来 是用于组织代码的,没有其他特别重要的意义。
全栈程序员站长
2022/07/09
4910
关于-#pragma
在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C ++语言完全兼容的情况下,给出主机或操作系统专有的特征。由于太复杂,在OC中主要在以下几个方面使用到:
進无尽
2018/09/12
1K0
关于-#pragma
C++ 温习笔记(2) - extern,预处理命令#pragma,static
extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。 在一个源文件里定义了一个数组:char a[6];   在另外一个文件里用下列语句进行了声明:extern char *a;   请问,这样可以吗?   答案与分析:   1)、不可以,程序运行时会告诉你非法访问。原因在于,指向类型T的指针并不等价于类型T的数组。extern char *a声明的是一个指针变量而不是字符数组,因此与实际的定义不同,从而造成运行时非法访问。应该将声明改为extern char a[ ]。   2)、例子分析如下,如果a[] = “abcd”,则外部变量a=0x61626364 (abcd的ASCII码值),*a显然没有意义   显然a指向的空间(0x61626364)没有意义,易出现非法内存访问。   3)、这提示我们,在使用extern时候要严格对应声明时的格式,在实际编程中,这样的错误屡见不鲜。   4)、extern用在变量声明中常常有这样一个作用,你在.c文件中声明了一个全局的变量,这个全局的变量如果要被引用,就放在.h中并用extern来声明。
干货满满张哈希
2021/04/12
7120
OpenMP并行编程简介
在这学期的并行计算课程中,老师讲了OpenMP,MPI,CUDA这3种并行计算编程模型,我打算把相关的知识点记录下来,便于以后用到的时候查阅。
王云峰
2019/12/25
3.2K0
OpenMP并行编程简介
【OpenMP学习笔记】编译制导指令
OpenMP通过在串行程序中插入编译制导指令, 来实现并行化, 支持OpenMP的编译器可以识别, 处理这些指令并实现对应的功能. 所有的编译制导指令都是以#pragma omp开始, 后面跟具体的功能指令(directive)或者命令. 一般格式如下所示:
零式的天空
2022/03/02
2.2K0
OpenMP并行编程入门指南
在C++中使用openmp进行多线程编程 - DWVictor - 博客园 (cnblogs.com)
用户9831583
2023/02/27
1.8K0
OpenMP并行编程入门指南
#pragma预处理指令
#pragma是C和C++编译器提供的一种预处理指令(preprocessor directive),用于控制编译器的行为或指示特定的编译器选项。它以#pragma开头,后面跟着不同的命令或参数。
叶茂林
2023/07/30
4700
刚开始玩openMP,总结一下遇到的一点小问题。
该文介绍了在Visual Studio中设置OpenMP支持并行计算,并给出了在for循环中使用OpenMP的示例代码。同时,文章也提醒了一些在设置OpenMP时需要关注的问题,例如变量类型、内存访问等。
MachineLP
2018/01/09
9030
xgboost 多线程,解决默认开启线程数为cpu个数问题
在一台48c的服务器上,就import xgboost,还没进行训练,通过命令发现,线程数就达到48个 代码:
lovelife110
2021/01/14
2.2K0
xgboost 多线程,解决默认开启线程数为cpu个数问题
OMP算法代码学习
正交匹配追踪(OMP)算法的MATLAB函数代码并给出单次测试例程代码 测量数M与重构成功概率关系曲线绘制例程代码 信号稀疏度K与重构成功概率关系曲线绘制例程代码 参考来源:http://blog.c
闪电gogogo
2018/01/08
2.2K0
OMP算法代码学习
【OpenMP学习笔记】更多指令和子句介绍
flush指令主要用于处理内存一致性问题. 每个处理器(processor)都有自己的本地(local)存储单元:寄存器和缓存, 当一个线程更新了共享变量之后, 新的值会首先存储到寄存器中, 然后更新到本地缓存中. 这些更新并非立刻就可以被其他线程得知, 因此在其它处理器中运行的线程不能访问这些存储单元. 如果一个线程不知道这些更新而使用共享变量的旧值就行运算, 就可能会得到错误的结果. 通过使用flush指令, 可以保证线程读取到的共享变量的最新值. 下面是语法形式:
零式的天空
2022/03/02
9330
【OpenMP学习笔记】与运行环境交互
OpenMP标准定义了内部控制变量(internal control variables), 这些变量可以影响程序运行时的行为, 但是它们不能被直接访问或者修改, 我们需要通过OpenMP函数或者环境变量来访问或者修改它们, 下面是被定义的内部变量
零式的天空
2022/03/02
1.4K0
OpenMP基础----以图像处理中的问题为例
1.循环语句中的循环变量必须是有符号整形,如果是无符号整形就无法使用,OpenMP3.0中取消了这个约束
流川疯
2022/05/10
1.2K0
OpenMP 并行编程初探
在当今多核处理器的时代,利用并行计算的能力以最大化性能已成为程序员的重要任务之一。OpenMP 是一种并行编程模型,可以让我们更容易地编写多线程程序。本文将深入浅出地探讨 OpenMP 的工作原理、基本语法和实际应用。
运维开发王义杰
2023/08/15
1.4K0
OpenMP 并行编程初探
请原谅我是个这么努力的单身狗,单线程已经无法表达我的爱!
“ 生活不止眼前的苟且, 还有套路与反套路的情人节! ” 今天是2017年的情人节, 在这样一场年度虐狗大会中, 如果还用鲜花巧克力的套路, 那就实在太无趣了! 就在Lady我在网络上发起用并行编
GPUS Lady
2018/04/02
9430
请原谅我是个这么努力的单身狗,单线程已经无法表达我的爱!
offload error: cannot find offload entry解决办法
linux环境下,使用MIC架构的Xeon Phi(至强融核)协处理器进行进行host+mic编程时,源程序运行的毫无问题,但将其通过ar命令生成静态连接库供其他应用程序使用时,就会出现offload error: cannot find offload entry错误。
恋喵大鲤鱼
2018/08/03
7290
C++性能优化系列——3D高斯核卷积计算(八)3D高斯卷积
因为是按照X Y Z的计算顺序,因此只能够在计算X维度的卷积时,复用之前实现的一维卷积计算函数。Y维度的计算是将一个Z平面上的二维数据中每行与卷积核中一个点相乘,并将31个点的卷积核计算出的结果累加至一行,更新到中间缓存的目标位置。Z维度的计算是将一个Z平面的二维数据和卷积核中的一个点相乘,并将31个点的卷积核计算出的结果累加至一个二维平面,更新到结果的目标位置。这里对Y 和 Z维度的计算都是通过编译器ICC实现向量化。 代码实现如下:
用户7886150
2021/02/10
1K0
OpenCV中OpenMP的使用
作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/
流川疯
2019/01/18
1.5K0
C++多线程-多核编程
多核编程并不是最近才兴起的新鲜事物。早在intel发布双核cpu之前,多核编程已经在业内存在了,只不过那时候是多处理器编程而已。为了实现多核编程,人们开发实现了几种多核编程的标准。open-mp就是其中的一种。对于open-mp还不太熟悉的朋友,可以参照维基百科的相关解释。
cwl_java
2020/01/15
2.3K0

相似问题

Pragma omp平行截面

11

pragma omp并行vs.杂注omp并行

12

pragma omp用于/并行不工作?

21

折叠的`#pragma并行与`#pragma omp并行的差异

13

内部杂注omp master或single的pragma omp

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文