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

Lucene中的自定义过滤器

云瑞
2023-03-14
public class MyDelimiterFilter : TokenFilter
{

    private readonly ITermAttribute _termAtt;
    private readonly IPositionIncrementAttribute _positionAtt;
    private readonly Queue<char[]> _terms;

    public WordDelimiterFilter(TokenStream inStream)
        : base(inStream)
    {
        _termAtt = AddAttribute<ITermAttribute>();
        _positionAtt = AddAttribute<IPositionIncrementAttribute>();
        _terms = new Queue<char[]>();
    }

    public override bool IncrementToken()
    {
        if (_terms.Count != 0)
        {
            var buffer = _terms.Dequeue();

            _termAtt.SetTermBuffer(buffer,0,buffer.Length);
            _positionAtt.PositionIncrement = 1;
            return true;
        }

        if (!input.IncrementToken())
        {
            return false;
        }

        if (_termAtt.Term.Contains("/"))
        {
            var tempArray = _termAtt.Term.Split('/');
            foreach (var item in tempArray)
            {
                _terms.Enqueue(item.ToCharArray());
            }
        }
        else
        {
            _terms.Enqueue(_termAtt.Term.ToCharArray());
        }

        return true;
    }
}  

我可以调试这个代码和逻辑路径似乎是正确的。如果我尝试搜索,我会发现带有“testdocument”“test/mystring/2014”的文档,但是没有结果,例如,“mystring”

我想念什么?

共有1个答案

虞唯
2023-03-14

这部分:

    if (_termAtt.Term.Contains("/"))
    {
        var tempArray = _termAtt.Term.Split('/');
        foreach (var item in tempArray)
        {
            _terms.Enqueue(item.ToCharArray());
        }
    }
    else
    {
        _terms.Enqueue(_termAtt.Term.ToCharArray());
    }

    return true;

不包含将_termatt设置为正确值或增加位置的逻辑。从incrementToken返回true的次数要比这种方式多得多。您能从查询对象的tostring方法中提供一个文本吗?

编辑:看起来你得到的查询是一个短语查询,而不是一个简单的术语查询。尝试在最后的return true;语句之前添加此代码段

    var buffer = _terms.Dequeue();

    _termAtt.SetTermBuffer(buffer,0,buffer.Length);
    _positionAtt.PositionIncrement = 1;
 类似资料:
  • 演示在网关追加一个header public class CustomFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 演示在网关追加heade

  • SOFARPC 提供了一套良好的可扩展性机制,为各个模块提供 SPI 的能力。 SOFARPC 对请求与响应的过滤链处理方式是通过多个过滤器 Filter 来进行具体的拦截处理,该部分可由用户自定义 Filter 扩展,自定义 Filter 的执行顺序在内置 Filter 之后。具体方式如下: Bolt Filter 新建自定义 Filter 。 public class CustomFilter

  • 我正在尝试在Dropwizard实例中添加自定义标题过滤器,以检查请求的版本是否与DropWidger实例的版本同步。 我看到您可以使用添加jetty。但是,我无法弄清楚如何设置自定义过滤器。 谢谢

  • 问题内容: 我试图在Log4J2中实现和配置自定义过滤器- 基于ThresholdFilter,但打算做更多。我已经看到了有关自定义追加程序的主题,这些主题遵循相同的插件注释语法,但是还没有找到有关自定义拟合程序的主题。 MyCustomFilter.java (基于ThresholdFilter) log4j2.xml LoggingRunner.java 配置语法似乎与Apache文档中的语法

  • 本文向大家介绍Django 自定义过滤器,包括了Django 自定义过滤器的使用技巧和注意事项,需要的朋友参考一下 示例 过滤器允许您将函数应用于变量。此函数可以使用0或1参数。语法如下: 过滤器可以链接在一起,因此非常有效: 如果将其翻译成python,上面的代码行将给出以下内容: 在此示例中,我们将编写一个verbose_name适用于模型(实例或类)或QuerySet的自定义过滤器。它将返回

  • Dorado支持在Client或Server端创建自定义的过滤器并指定过滤器的优先级生成过滤器链路。 Dorado支持全局生效的Filter和单个配置生效的Filter,具体使用方式见下面说明。 1.过滤器接口定义 package com.meituan.dorado.rpc.handler.filter; /** * 过滤器接口, 可自行实现 * * 全局生效Filter,通过SPI配置