Solr TextField 到 Java @Field 映射
Solr TextField to Java @Field Mapping
我在 Spring 应用程序中使用 Solr 5.2.1(开发 PC 上的简单独立实例)和 运行 Solrj。
我一切正常(Solrj 客户端能够提交和检索已用 @Field 注释注释的域模型)但是我想在域模型的一个字段上使用自由文本搜索,所以我更改了它从 String 键入 Text Field,我的理解是这将允许更自由的文本搜索方法而不是 key:value 对键入搜索,其中 solr 全部返回或什么都不返回。
schema.xml 片段
<field name="description" type="text_general" indexed="true" stored="true"/>
Java豆瓣
public String getDescription() {
return description;
}
@Field
public void setDescription(String description) {
this.description = description;
}
Save 端工作正常,我能够通过 java bean ans solrj 更新 solr vai 并使用 http 客户端我可以看到数据进入,我遇到的问题是我似乎无法在查询时让 java bean 退出。 Solr 在尝试填充 bean 时不喜欢基于字符串的 setter。我收到以下错误:
Caused by: org.apache.solr.client.solrj.beans.BindingException: Exception while setting value : [PetShop] on public void search.CompanySummarySolr.setDescription(java.lang.String)
INFO [stdout] (http-localhost-127.0.0.1-8080-6) at org.apache.solr.client.solrj.beans.DocumentObjectBinder$DocField.set(DocumentObjectBinder.java:447)
INFO [stdout] (http-localhost-127.0.0.1-8080-6) at org.apache.solr.client.solrj.beans.DocumentObjectBinder$DocField.inject(DocumentObjectBinder.java:430)
INFO [stdout] (http-localhost-127.0.0.1-8080-6) at org.apache.solr.client.solrj.beans.DocumentObjectBinder.getBean(DocumentObjectBinder.java:64)
INFO [stdout] (http-localhost-127.0.0.1-8080-6) ... 64 more
INFO [stdout] (http-localhost-127.0.0.1-8080-6) Caused by: java.lang.IllegalArgumentException: argument type mismatch
我理解错误,我只是不知道如何映射文本字段。在 http 客户端中,Json 输出看起来像一个数组,但在 Solr API http://lucene.apache.org/solr/5_2_0/solr-core/org/apache/solr/schema/TextField.html 中,它扩展了对象而不是数组。
我能看到的是我需要以太坊有这样的字段
@Field
public void setDescription(Object description) {
this.description = (???) description;
}
在这种情况下,如何将其恢复为字符串?
或者我可以使用 org.apache.solr.schema.TextField
@Field
public void setDescription(TextField description) {
this.description = description.getValueSource(???, ???);
}
但对于初学者来说,我也不太明白如何取回字符串,其次,我似乎必须将整个 solr 库拉入项目,因为 TextField 对象不在 Solrj 中图书馆。
我确定我错过了一些东西,所有其他字段的映射都非常简单,但我找不到一个示例来说明如何将描述作为字符串返回给客户端,并允许在此字段上进行自由文本搜索,据我所知,字符串不允许这种类型的搜索。
非常感谢任何帮助
所以看起来 Solr 将 TextField 默认为多值字段。这意味着 Solr 将我传入的字符串字段包装成一个数组,这会导致 Bean Setter 中断,因为 Solr 想要 return 一个包含 1 个字符串而不是字符串的数组。
要解决此问题,只需编辑您的 Schema.xml 文件并明确告诉 Solr text_general 是一个单一值,因此在我的例子中,描述字段变为
来自:
<field name="description" type="text_general" indexed="true" stored="true"/>
为此:
<field name="description" type="text_general" indexed="true" stored="true" multiValued="false"/>
现在 Solr 愉快地将我的响应转换成它的组件 java bean。
我在 Spring 应用程序中使用 Solr 5.2.1(开发 PC 上的简单独立实例)和 运行 Solrj。
我一切正常(Solrj 客户端能够提交和检索已用 @Field 注释注释的域模型)但是我想在域模型的一个字段上使用自由文本搜索,所以我更改了它从 String 键入 Text Field,我的理解是这将允许更自由的文本搜索方法而不是 key:value 对键入搜索,其中 solr 全部返回或什么都不返回。
schema.xml 片段
<field name="description" type="text_general" indexed="true" stored="true"/>
Java豆瓣
public String getDescription() {
return description;
}
@Field
public void setDescription(String description) {
this.description = description;
}
Save 端工作正常,我能够通过 java bean ans solrj 更新 solr vai 并使用 http 客户端我可以看到数据进入,我遇到的问题是我似乎无法在查询时让 java bean 退出。 Solr 在尝试填充 bean 时不喜欢基于字符串的 setter。我收到以下错误:
Caused by: org.apache.solr.client.solrj.beans.BindingException: Exception while setting value : [PetShop] on public void search.CompanySummarySolr.setDescription(java.lang.String)
INFO [stdout] (http-localhost-127.0.0.1-8080-6) at org.apache.solr.client.solrj.beans.DocumentObjectBinder$DocField.set(DocumentObjectBinder.java:447)
INFO [stdout] (http-localhost-127.0.0.1-8080-6) at org.apache.solr.client.solrj.beans.DocumentObjectBinder$DocField.inject(DocumentObjectBinder.java:430)
INFO [stdout] (http-localhost-127.0.0.1-8080-6) at org.apache.solr.client.solrj.beans.DocumentObjectBinder.getBean(DocumentObjectBinder.java:64)
INFO [stdout] (http-localhost-127.0.0.1-8080-6) ... 64 more
INFO [stdout] (http-localhost-127.0.0.1-8080-6) Caused by: java.lang.IllegalArgumentException: argument type mismatch
我理解错误,我只是不知道如何映射文本字段。在 http 客户端中,Json 输出看起来像一个数组,但在 Solr API http://lucene.apache.org/solr/5_2_0/solr-core/org/apache/solr/schema/TextField.html 中,它扩展了对象而不是数组。
我能看到的是我需要以太坊有这样的字段
@Field
public void setDescription(Object description) {
this.description = (???) description;
}
在这种情况下,如何将其恢复为字符串?
或者我可以使用 org.apache.solr.schema.TextField
@Field
public void setDescription(TextField description) {
this.description = description.getValueSource(???, ???);
}
但对于初学者来说,我也不太明白如何取回字符串,其次,我似乎必须将整个 solr 库拉入项目,因为 TextField 对象不在 Solrj 中图书馆。
我确定我错过了一些东西,所有其他字段的映射都非常简单,但我找不到一个示例来说明如何将描述作为字符串返回给客户端,并允许在此字段上进行自由文本搜索,据我所知,字符串不允许这种类型的搜索。
非常感谢任何帮助
所以看起来 Solr 将 TextField 默认为多值字段。这意味着 Solr 将我传入的字符串字段包装成一个数组,这会导致 Bean Setter 中断,因为 Solr 想要 return 一个包含 1 个字符串而不是字符串的数组。
要解决此问题,只需编辑您的 Schema.xml 文件并明确告诉 Solr text_general 是一个单一值,因此在我的例子中,描述字段变为
来自:
<field name="description" type="text_general" indexed="true" stored="true"/>
为此:
<field name="description" type="text_general" indexed="true" stored="true" multiValued="false"/>
现在 Solr 愉快地将我的响应转换成它的组件 java bean。