java - 自定义标记器 solr 仅在第一次调用

标签 java plugins solr lucene tokenize

我创建了一个自定义分词器,通过检查 admin/analysis.jsp 和 system.out 日志,它似乎工作正常。但是,当我在使用此自定义分词器的字段中执行查询时,我看到仅针对第一个查询字符串调用了自定义分词器 solr(通过 system.out 日志检查)。 你能帮我指出我错了吗? 这些是我的代码:

package com.fosp.searchengine;
import java.io.Reader;
import org.apache.lucene.analysis.WhitespaceTokenizer;
import org.apache.solr.analysis.WhitespaceTokenizerFactory;

public class JvnTextProTokenizerFactory extends WhitespaceTokenizerFactory{
    @Override
    public WhitespaceTokenizer create(Reader input) {
        System.out.println("WhitespaceTokenizer create(Reader input)");
        Reader processedStringReader = new ProcessedStringReader(input);
        return new WhitespaceTokenizer(processedStringReader);
    }

}


package com.fosp.searchengine;
import java.io.IOException;
import java.io.Reader;

public class ProcessedStringReader extends java.io.Reader {

    private static final int BUFFER_SIZE = 1024 * 8;
    private static TextProcess m_textProcess = null;
    private char[] m_inputData = null;
    private int m_offset = 0;
    private int m_length = 0;
    public ProcessedStringReader(Reader input){
        char[] arr = new char[BUFFER_SIZE];
        StringBuffer buf = new StringBuffer();
        int numChars;

        try {
            while ((numChars = input.read(arr, 0, arr.length)) > 0) {
                buf.append(arr, 0, numChars);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        if(m_textProcess == null){
            try {
                m_textProcess = new TextProcess();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        m_inputData = m_textProcess.processText(buf.toString()).toCharArray();
        m_offset = 0;
        m_length = m_inputData.length;
    }

    @Override
    public int read(char[] cbuf, int off, int len) throws IOException {
        int charNumber = 0;
        for(int i = m_offset + off;i<m_length && charNumber< len; i++){
            cbuf[charNumber] = m_inputData[i];
            m_offset ++;
            charNumber++;
        }
        if(charNumber == 0){
            return -1;
        }
        return charNumber;
    }

    @Override
    public void close() throws IOException {
        m_inputData = null;
        m_offset = 0;
        m_length = 0;
    }

}

架构.xml

<fieldType name="text_jvnTextPro" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
        <tokenizer class="com.fosp.searchengine.JvnTextProTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
        <tokenizer class="com.fosp.searchengine.JvnTextProTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>       
  </analyzer>
</fieldType>

最佳答案

这里没有错。工厂实例化的类被重新使用。这在分析/管理页面中是不同的。区别在于。

关于java - 自定义标记器 solr 仅在第一次调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10185076/

相关文章:

java - 在 Java Bean 中获取 "last visited field"

java - Spring - 如何在 View 之间传递消息?

java - 有没有办法对我的代码进行签名或保护它?

solr - SOLR 中的多值属性分组

solr - Solr 中的可更新字段

java - 在编写实际代码之前在测试驱动开发中编写 junits?

android - 使用Android Studio创建新的Flutter项目时出现问题

macos - 当两个 macOS .plugin 依赖于同一个 .dylib 并且每个都将它分别捆绑在插件文件夹中时会发生什么?

具有插件之间共享接口(interface)的 C# 插件架构

java - Solr : How to Index a field in document as json field?