Solrj 和动态字段

Posted

技术标签:

【中文标题】Solrj 和动态字段【英文标题】:Solrj and Dynamic Fields 【发布时间】:2011-09-08 10:52:11 【问题描述】:

我有一个 solr 架构,其中包含不同类型的动态字段。例如,在 schema.xml 中有:

<dynamicField name="*_s" type="string" indexed="true"  stored="true"/>
<dynamicField name="*_i" type="int"    indexed="true"  stored="true"/>
<dynamicField name="*_l" type="long"   indexed="true"  stored="true"/>
<dynamicField name="*_f" type="float"  indexed="true"  stored="true"/>
<dynamicField name="*_d" type="double" indexed="true"  stored="true"/>

我想使用 SolrJ 注释的 POJO 访问这些字段。我知道我可以为 POJO 中的每种数据类型提供不同的 Map 引用,如下所示:

...
@Field("*_s")
public Map<String, String> strings;

@Field("*_i")
public Map<String, Integer> integers;
...

但是是否可以将所有动态字段存储在同一个地图中?我在想这样的事情:

...
@Field("*_s")
@Field("*_i")
public Map<String, Object> dynamicFields;
...

我能找到的关于 SolrJ、POJO 和动态字段的唯一文档是一个旧的功能请求: https://issues.apache.org/jira/browse/SOLR-1129

【问题讨论】:

【参考方案1】:

我计算出@Field 注释中的“模式”值的匹配不必与您的 schema.xml 中的匹配。所以,我在我的文档类中定义了一个地图:

@Field("*DF")
private Map<String, Object> dynamicFields;

然后在 schema.xml 中,dynamicFields 具有以 'DF' 为后缀的模式:

<dynamicField name="*_sDF" type="string" indexed="true" stored="true"/>
<dynamicField name="*_siDF" type="sint" indexed="true" stored="true"/>
<dynamicField name="*_tDF" type="date" indexed="true" stored="true"/>

现在使用 solrServer.addBean(doc) 和 solrResponse.getBeans(Doc.class) 存储和检索具有不同值类型的所有 dynamicField。这是 Solr 3.2.0 它不适用于 1.4..

【讨论】:

谢谢蒂姆,这对我有帮助。我还发现对于动态字段,必须为字段注释提供模式,即使它只是“*”。 'stored' 属性也可以为 false。

以上是关于Solrj 和动态字段的主要内容,如果未能解决你的问题,请参考以下文章

如何使用SOLRJ java客户端从SOLR获取列名(字段)?

动态添加/删除多个输入字段和输入行 PHP(动态表单中的动态表单)

GroovyMOP 元对象协议与元编程 ( Expando 动态类 | 创建动态类 | 为动态类增加字段和方法 )

solr搜索之solrJ语法

动态生成的字段和数据在提交后保留

显示所有 acf 字段和 acf 选项页面字段的 Elementor 动态字段