Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Solr字符串字段类型最大可索引字符数_Solr - Fatal编程技术网

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

Solr字符串字段类型最大可索引字符数,solr,Solr,我使用solr字符串字段来提供文本字段上的精确匹配(我已经查看了文本字段类型,不相信它对我有用-我想精确地重现Sql的类似功能,包括空格和通配符) 我的问题是,当我索引大型文本字段时,Solr在搜索这些字段时不会返回任何数据。该限制似乎是int16.max 作为测试,我创建了一个带有id字段和string字段的索引。如果id字段为“1”,且string字段包含40000个字符: id:1将返回两个字段,其中包含40000个字符,表明它已被索引 string:不返回任何结果 如果字符串字段仅包

我使用solr字符串字段来提供文本字段上的精确匹配(我已经查看了文本字段类型,不相信它对我有用-我想精确地重现Sql的类似功能,包括空格和通配符)

我的问题是,当我索引大型文本字段时,Solr在搜索这些字段时不会返回任何数据。该限制似乎是int16.max

作为测试,我创建了一个带有
id
字段和
string
字段的索引。如果
id
字段为“1”,且
string
字段包含40000个字符:

  • id:1
    将返回两个字段,其中包含40000个字符,表明它已被索引
  • string:
    不返回任何结果
如果字符串字段仅包含30000个字符,则一切都正常

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


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

我花了很多时间在这个问题上,所以我发布了我提出的解决方案,以防其他人遇到这个问题。使用文本字段类型和关键字标记器的工作方式与字符串字段类似,一直到我遇到的字符串字段类型的长度限制

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

  • 他想要标准行为,所以他的是基于标准标记器的,而我希望它像字符串字段一样工作。我第一次尝试使用KeywordTokenizer,但仍然受到限制,所以最终我使用的是WhitespaceTokenizer(详见下文)

  • 那里的代码已经过时,不能与Solr 4.0一起使用

  • WhitespaceTokenizer的代码非常短,它包含一个名为
    isTokenChar
    的方法,返回
    !字符。isWhitespace(c)。我只是简单地将其更改为始终返回true。之后,我创建了一个TokenizerFactory来返回它,并在schema.xml中引用它,方法与链接线程相同

    MyCustomTokenizer.java:

    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个字符)。如果有人找到更好的方法,请发布

    我不确定这一点,但这可以被视为一种解决办法。尝试使用“Text”字段类型和“KeywordTokenizer”一起使用,这将像“string”字段一样工作..我试过了,但不起作用。您是否将标记器添加到任何其他配置文件中?我通过将其添加到配置xml中来创建它。但是您是否在没有ngram筛选器的情况下管理字段子字符串的查找匹配?