索引 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 中的一个错误。

更新二:

filed a bug in the Alfresco JIRA.

假设一

如果您的内容包含类似的超长术语(长度为 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

中的缓存模型