full-text-search - 无法在 lucene 索引中搜索所有生成的术语

标签 full-text-search lucene

我正在使用自定义分析器索引和搜索代码。给定文本“will wi-fi work”,生成以下标记('will' 是停用词,已消除)。

wi-fi {position:2 start:5 end:10}
wifi {position:2 start:5 end:10}
wi {position:2 start:5 end:7}
fi {position:2 start:8 end:10}
work {position:3 start:11 end:15}

当我搜索词 wi-fi, work 时,我会得到搜索结果。但是,当我对 wifi、wi、fi 发出任何查询(短语/非短语)时,我没有得到任何结果。生成的 token 有什么问题吗?

解析的搜索查询:

对于 wi-fi(工作正常)
Lucene's: +matchAllDocs:true +(alltext:wi-fi alltext:wifi alltext:wi alltext:fi)

对于 wifi(没有返回结果)
Lucene's: +matchAllDocs:true +alltext:wifi

对于“将 wi-fi 工作”(工作正常)
Lucene's: +matchAllDocs:true +alltext:"(wi-fi wifi wi fi) work"

对于“将 wifi 工作”(没有返回结果)
Lucene's: +matchAllDocs:true +alltext:"? wifi work"

更新

发现问题:
public boolean incrementToken() throws IOException
{
    /*
     * first return all tokens in the list
     */
    if (tokens.size() > 0)
    {
        Token top = tokens.removeFirst();
        restoreState(current);
        **termAtt.setEmpty().append(new String(top.buffer(), 0, top.length()));**
        offsetAtt.setOffset(top.startOffset(), top.endOffset());
        posIncrAtt.setPositionIncrement(0);
        return true;
    }

    /*
     * if there are no more incoming tokens return false
     */
    if (!input.incrementToken())
        return false;

    Token wrapper = new Token();
    wrapper.copyBuffer(termAtt.buffer(), 0, termAtt.length());
    wrapper.setStartOffset(offsetAtt.startOffset());
    wrapper.setEndOffset(offsetAtt.endOffset());
    wrapper.setPositionIncrement(posIncrAtt.getPositionIncrement());

    normalizeHyphens(wrapper);
    current = captureState();
    return true;
}

在上面的粗体中,我说的是
termAtt.setEmpty().append(new String(top.buffer()));

当我搜索 无线 ,我没有得到任何结果,但是 无线* 用于给出结果。看起来这个 top.buffer() 包含一些额外的垃圾,导致奇怪的行为。

浪费了一天的时间:(

最佳答案

只是在不了解您的分析器或解析器的情况下猜测。

  • 确保您在搜索中使用的词 wi,fi 不是停用词的一部分。可能停止列表文件是您检查的地方
  • 分面搜索/加权搜索。确保你没有弄乱这些。
  • 解析/分析后,确保您确实获得了您正在搜索的标记化术语。
  • 确保您的条款被插入索引。
  • 关于full-text-search - 无法在 lucene 索引中搜索所有生成的术语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10084854/

    相关文章:

    java - 什么是合适的 lucene 分析器?

    java - Apache Lucene createFullTextQuery 返回匹配的空对象

    SQL-Server 全文索引意外结果

    java - AppEngine 全文文档索引使用词干运算符进行搜索

    java - 使用 Lucene 作为存储

    java - Lucene查询修改

    sql-server-2008 - SQL Server 2008全文搜索性能问题

    database - 全文搜索与标准数据库搜索

    sorting - 如何按score + boost + field对 Elasticsearch 结果进行排序?

    exception - 如果在空的RAMDirectory上调用IndexSearcher,则为IndexNotFoundException