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

Solr字符串字段类型最大可索引字符

於和志
2023-03-14
    null

我找不到任何说明这是一个限制的文档,也找不到任何绕过它的方法,因为maxFieldLength在4.0中被删除,并且string字段不支持分析器。

有其他人遇到这个问题或找到了解决办法吗?

共有1个答案

辛盛
2023-03-14

我花了很多时间在这个问题上,所以我张贴我想出的解决方案,以防其他人遇到这个问题。在KeywordTokenizer中使用文本字段类型确实与字符串字段类似,直到我在字符串字段类型中遇到的长度限制。

最终,我在阅读了下面的线程后创建了一个自定义标记器,并做了一些更改:

>

  • 他想要标准的行为,所以他的行为是基于StandardTokenizer,而我想让它像一个字符串字段一样。我第一次尝试使用KeywordTokenizer,但仍然遇到了一些限制,所以最终我将我的方法基于WhitespaceTokenizer(更多见下文)。

    package custom.analysis;
    
    import java.io.Reader;
    import org.apache.lucene.analysis.Tokenizer;
    import org.apache.lucene.analysis.util.CharTokenizer;
    import org.apache.lucene.util.AttributeSource;
    import org.apache.lucene.util.Version;
    
    public final class MyCustomTokenizer extends CharTokenizer {
    
      public MyCustomTokenizer(Version matchVersion, Reader in) {
        super(matchVersion, in);
      }
    
      public MyCustomTokenizer(Version matchVersion, AttributeSource source, Reader in) {
        super(matchVersion, source, in);
      }
    
      public MyCustomTokenizer(Version matchVersion, AttributeFactory factory, Reader in) {
        super(matchVersion, factory, in);
      }
    
      @Override
      protected boolean isTokenChar(int c) {
        return true; //!Character.isWhitespace(c);
      }
    }
    

    MyCustomTokenizerFactory.java:

    package custom.analysis;
    
    import org.apache.lucene.analysis.util.TokenizerFactory;
    import org.apache.lucene.analysis.core.KeywordTokenizerFactory;
    import org.apache.lucene.analysis.core.KeywordTokenizer;
    
    import java.io.Reader; 
    import org.apache.lucene.util.Version;
    
    
    public class MyCustomTokenizerFactory extends TokenizerFactory {
      public MyCustomTokenizer create(Reader input) { 
        final MyCustomTokenizer tokenizer = new MyCustomTokenizer(Version.LUCENE_40, input); 
        return tokenizer; 
      } 
    } 
    

    schema.xml:

    <fieldType name="text_block" class="solr.TextField" positionIncrementGap="100"> 
       <analyzer> 
         <tokenizer class="custom.analysis.MyCustomTokenizerFactory" />        
       </analyzer> 
    </fieldType> 
    

    使用这种方法,我能够索引大型文本字段(>100k个字符),并具有字符串字段之类的功能。如果有人找到更好的办法,请贴出来!

  •  类似资料:
    • 问题内容: 我在MySQL表中有两个表字段。一个是VARCHAR,是分类广告(分类网站)的“标题”。另一个是TEXT字段,其中包含用于分类的“文本”。 两个问题: 如何确定如何索引这两个字段? (什么字段类型,要使用什么类,等等) 目前,我有一个“ ad_id”作为每个广告的唯一标识符,例如“ bmw_m3_82398292”。 每当SOLR找到“查询匹配”时,如何使SOLR返回此标识符? (标识

    • 请帮助解决此错误... 因为我在该对象上使用了bigdecimal类型,而没有添加一个操作@字段(type=FieldType.Double) 有没有办法配置默认的FieldType。大十进制加倍?或者我们需要在每个大十进制中添加字段注释

    • 版本字符串有一个支持java类(版本),它实现了Comparable。 我的分析器是一个分析器包装器,它是一个小写和空格分析器,类似于内置的分析器。我使用经典的查询解析器进行搜索。在确切的条件下搜索工作良好。 我想做的是: 我试图在索引之前将版本字符串转换为int,但查询输入需要以某种方式转换,以便在搜索之前将版本字符串转换为int。 看起来我必须为version字段实现一个自定义分析器,但是我在

    • 问题内容: 我曾经在JavaScript中这样做: Swift没有此功能,如何做类似的事情? 问题答案: 编辑/更新: Xcode 11•Swift 5.1或更高版本 用法: 不区分大小写的样本 正则表达式样本

    • 我有映射: 和一些文件: 等等。 我尝试进行查询: 未找到任何结果。如果我尝试将同一查询按字段与其他类型(不是字符串,也没有原始子字段)一起使用,它会起作用。我应该如何为这种情况编写查询?谢谢 P、 美国字段“FieldA”具有子字段raw,因为我需要同时分析和不分析此字段

    • 这章我们来着重介绍一下字符串。 刚刚学习Rust的同学可能会被Rust的字符串搞混掉,比如str,String, OsStr, CStr,CString等等…… 事实上,如果你不做FFI的话,常用的字符串类型就只有前两种。我们就来着重研究一下Rust的前两种字符串。 你要明白的是,Rust中的字符串实际上是被编码成UTF-8的一个字节数组。这么说比较拗口,简单来说,Rust字符串内部存储的是一个u