当前位置: 首页 > 知识库问答 >
问题:

我们可以在语音索引中使用spanneQuery吗?

夹谷浩博
2023-03-14

我已经实现了一个基于lucene的软件来索引超过1000万的人名,这些人名可以用不同的方式书写,比如“Luíz”和“Luis”。索引是使用各个标记的语音值创建的(创建了一个自定义分析器)。

目前,我正在使用QueryParser查询一个给定的名称,结果很好。但是,在《Lucene in Action》一书中提到,SpanarQuery可以使用标记的接近性来改进我的查询。我对名称的非拼音索引使用了SpanarQuery,结果比QueryParser要好。

由于我们应该使用用于索引的同一分析器进行查询,我找不到如何同时使用自定义语音分析器和SpanarQuery,或重新措辞:

    how can I use SpanNearQuery on the phonetic index?

提前谢谢。

共有1个答案

杜苏燕
2023-03-14

我的第一个想法是:用slop进行短语查询不会起作用吗?这肯定是最简单的方法:

"term1 term2"~5

这将使用您的语音分析器,并生成带有结果标记的邻近查询。

所以,如果你真的需要在这里使用西班牙查询(也许你正在使用模糊查询或通配符或诸如此类的东西,或者短语查询一直在威胁你,你不想再与之有任何关系),你需要自己进行分析。您可以通过从Analyzer.tokenStream获取TokenStream并迭代分析的令牌来实现这一点。

如果您使用的语音算法每个术语产生一个代码(例如soundex):

SpanNearQuery.Builder nearBuilder = new SpanNearQuery.Builder("text", true);
nearBuilder.setSlop(4);

TokenStream stream = analyzer.tokenStream("text", queryStringToParse);
stream.addAttribute(CharTermAttribute.class);
stream.reset();
while(stream.incrementToken()) {
    CharTermAttribute token = stream.getAttribute(CharTermAttribute.class);
    nearBuilder.addClause(new SpanTermQuery(new Term("text", token.toString())));
}
Query finalQuery = nearBuilder.build();
stream.close();

如果你使用的是双隐喻,你可以在同一个位置上有1-2个词组,这有点复杂,因为你需要考虑那些位置增量:

SpanNearQuery.Builder nearBuilder = new SpanNearQuery.Builder("text", true);
nearBuilder.setSlop(4);

TokenStream stream = analyzer.tokenStream("text", "through and through");
stream.addAttribute(CharTermAttribute.class);
stream.addAttribute(PositionIncrementAttribute.class);
stream.reset();
String queuedToken = null;
while(stream.incrementToken()) {
    CharTermAttribute token = stream.getAttribute(CharTermAttribute.class);
    PositionIncrementAttribute increment = stream.getAttribute(PositionIncrementAttribute.class);

    if (increment.getPositionIncrement() == 0) {
        nearBuilder.addClause(new SpanOrQuery(
                new SpanTermQuery(new Term("text", queuedToken)),
                new SpanTermQuery(new Term("text", token.toString()))
                ));
        queuedToken = null;
    }
    else if (increment.getPositionIncrement() >= 1 && queuedToken != null) {
        nearBuilder.addClause(new SpanTermQuery(new Term("text", queuedToken)));
        queuedToken = token.toString();
    }
    else {
        queuedToken = token.toString();
    }
}

if (queuedToken != null) {
    nearBuilder.addClause(new SpanTermQuery(new Term("text", queuedToken)));
}

Query finalQuery = nearBuilder.build();
stream.close();
 类似资料:
  • 问题内容: 我想知道我们是否可以使用索引访问列表 例如: 问题答案: 由于是运算符,而Java不支持运算符重载,因此您不能将其与List一起使用。相反,您必须使用和方法,这些方法可能很冗长,但提供的功能完全相同。

  • 本文向大家介绍我们可以在MySQL查询中使用SELECT NULL语句吗?,包括了我们可以在MySQL查询中使用SELECT NULL语句吗?的使用技巧和注意事项,需要的朋友参考一下 是的,我们可以在MySQL查询中使用SELECT NULL语句。让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记录- 这将产生以下输出- 以下是实现SELECT NULL

  • 问题内容: 我知道Python提供了API,因此您可以在C代码中调用Python解释器,但是我想要的却是相反的。 我的程序需要使用一些C API,所以代码必须用C编写。但是我也想用Python打包程序。这意味着我想在Python中调用这些C函数或可执行文件。那可能吗? 如果我希望C代码成为一个库,这意味着我将它与Python 中的可能的链接一起使用,该怎么做?那可能吗?如果我将C代码写入可执行文件

  • 本文向大家介绍我们可以在MySQL中使用ORDER BY NULL吗?,包括了我们可以在MySQL中使用ORDER BY NULL吗?的使用技巧和注意事项,需要的朋友参考一下 是的,我们可以做到 注–在MySQL 5.7之前,ORDER BY NULL很有用,但在MySQL 8.0中,例如,最后不需要指定ORDER BY NULL以抑制隐式排序。 让我们首先创建一个表- 使用插入命令在表中插入一些

  • 本文向大家介绍我们可以在JSP中使用XPath表达式的switch语句吗?,包括了我们可以在JSP中使用XPath表达式的switch语句吗?的使用技巧和注意事项,需要的朋友参考一下 在<X:选择>标签的运作方式类似于Java的switch语句。有了这个,您可以在多种选择之间进行选择。如果switch语句具有case语句,则<x:choose>标记具有<x:when>标记。以类似的方式,switc

  • 问题内容: 非常感谢@Random,我对映射进行了如下修改。为了进行测试,我使用“电影”作为索引类型。注意:我还添加了search_analyzer。没有那我没有得到适当的结果。但是我对使用search_analyzer有以下疑问。 1]如果是语言分析器,我们可以使用自定义search_analyzer吗? 2]我是否由于使用过的n-gram分析器而不是由于英语分析器而获得了所有结果? 更新: 使