索引 d:content 属性 内容 > 32 KB
Indexing d:content property with content > 32 KB
我有一个 Alfresco 模型类型,还有一个 属性 类型 d:content
。当我尝试在其中存储大于 32 KB 的内容时,此 属性 会导致 Solr 异常。这个属性的当前定义是
<property name="acme:secondContent">
<type>d:content</type>
<mandatory>false</mandatory>
<index enabled="true">
<atomic>true</atomic>
<stored>true</stored>
<tokenised>both</tokenised>
</index>
</property>
如果我将大于 32 KB 的内容放入此 属性,Solr 在尝试对其编制索引时抛出此异常:
java.lang.IllegalArgumentException: Document contains at least one immense term in field="content@s____@{http://acme.com/model/custom/1.0}secondContent" (whose UTF8 encoding is longer than the max length 32766), all of which were skipped. Please correct the analyzer to not produce such terms.
更改 index
配置没有帮助,index
的所有变体和我尝试过的子元素都会抛出错误。
在another question中回答:
The maximum size for the a single term in the underlying Lucene index is 32776 bytes, which is I believe hard coded.
如何配置 d:content
属性 的 index
以便我可以保存和索引大于 32 KB 的内容?
编辑:
在contentModel.xml
中,cm:content
是这样配置的:
<index enabled="true">
<atomic>true</atomic>
<stored>false</stored>
<tokenised>true</tokenised>
</index>
添加内容大于 32 KB 的简单 text/plain
文件没有问题。
我的自定义 属性 的相同 index
配置仍然失败。
更新:
在 Alfresco 4.2fCE 下,问题不会发生。所以这是 Alfresco 5.0c 和 Solr 4.1.9 中的一个错误。
更新二:
假设一
如果您的内容包含类似的超长术语(长度为 32k 的单个单词),则必须实现自己的 Lucene 分析器以支持该特定类型的文本。这意味着这是一个与默认 Lucene 实现相关的问题,因为它是硬编码的。
假设2
否则,如果您的内容不是按照上述方式构建的,我觉得这很奇怪,可能是一个错误。如果您不使用 tokenised=true 解决问题,在这种情况下,可能的解决方法是更改内容模型以支持父节点与包含相关文本但使用默认 cm:content 属性。我的意思是使用你应该解决的关联 ;)
希望这对您有所帮助。
解决方案是不将完整的 doc/part 存储在索引中。因此,请尽量避免在大于 32k 的大型属性上使用 store=true 和 tokenize=both/false。如果您的模型声明如下所示,索引应该可以工作:
<property name="acme:secondContent">
<type>d:content</type>
<mandatory>false</mandatory>
<index enabled="true">
<atomic>true</atomic>
<stored>false</stored>
<tokenised>true</tokenised>
</index>
</property>
缺点:在我的测试中,我不得不删除整个索引。我不足以删除 solr
中的缓存模型
我有一个 Alfresco 模型类型,还有一个 属性 类型 d:content
。当我尝试在其中存储大于 32 KB 的内容时,此 属性 会导致 Solr 异常。这个属性的当前定义是
<property name="acme:secondContent">
<type>d:content</type>
<mandatory>false</mandatory>
<index enabled="true">
<atomic>true</atomic>
<stored>true</stored>
<tokenised>both</tokenised>
</index>
</property>
如果我将大于 32 KB 的内容放入此 属性,Solr 在尝试对其编制索引时抛出此异常:
java.lang.IllegalArgumentException: Document contains at least one immense term in field="content@s____@{http://acme.com/model/custom/1.0}secondContent" (whose UTF8 encoding is longer than the max length 32766), all of which were skipped. Please correct the analyzer to not produce such terms.
更改 index
配置没有帮助,index
的所有变体和我尝试过的子元素都会抛出错误。
在another question中回答:
The maximum size for the a single term in the underlying Lucene index is 32776 bytes, which is I believe hard coded.
如何配置 d:content
属性 的 index
以便我可以保存和索引大于 32 KB 的内容?
编辑:
在contentModel.xml
中,cm:content
是这样配置的:
<index enabled="true">
<atomic>true</atomic>
<stored>false</stored>
<tokenised>true</tokenised>
</index>
添加内容大于 32 KB 的简单 text/plain
文件没有问题。
我的自定义 属性 的相同 index
配置仍然失败。
更新:
在 Alfresco 4.2fCE 下,问题不会发生。所以这是 Alfresco 5.0c 和 Solr 4.1.9 中的一个错误。
更新二:
假设一
如果您的内容包含类似的超长术语(长度为 32k 的单个单词),则必须实现自己的 Lucene 分析器以支持该特定类型的文本。这意味着这是一个与默认 Lucene 实现相关的问题,因为它是硬编码的。
假设2
否则,如果您的内容不是按照上述方式构建的,我觉得这很奇怪,可能是一个错误。如果您不使用 tokenised=true 解决问题,在这种情况下,可能的解决方法是更改内容模型以支持父节点与包含相关文本但使用默认 cm:content 属性。我的意思是使用你应该解决的关联 ;)
希望这对您有所帮助。
解决方案是不将完整的 doc/part 存储在索引中。因此,请尽量避免在大于 32k 的大型属性上使用 store=true 和 tokenize=both/false。如果您的模型声明如下所示,索引应该可以工作:
<property name="acme:secondContent">
<type>d:content</type>
<mandatory>false</mandatory>
<index enabled="true">
<atomic>true</atomic>
<stored>false</stored>
<tokenised>true</tokenised>
</index>
</property>
缺点:在我的测试中,我不得不删除整个索引。我不足以删除 solr
中的缓存模型