Solr TextField到Java @Field Mapping

时间:2016-05-17 20:34:02

标签: solr solrj

我正在使用Solr 5.2.1(开发PC上的简单独立实例)和在Spring应用程序中运行Solrj。

我一切正常(Solrj Client能够提交并检索已使用@Field注释注释的域模型)但是我想在域模型的某个字段上使用自由文本搜索,所以我改变了它的类型字符串文本字段,我的理解是这将允许更自由的文本方法来搜索而不是键:值对类型搜索solr全部或全部返回。

schema.xml摘录

<field name="description" type="text_general" indexed="true" stored="true"/>

Java bean代码段

public String getDescription() {
   return description;
}

@Field
public void setDescription(String description) {
    this.description = description;
}

Save方面工作正常,我能够更新solr vai java bean ans solrj并使用http客户端我可以看到数据进入,我遇到的问题是我似乎无法获得java bean查询时出来。 Solr在尝试填充bean时不喜欢基于String的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中,它扩展了Object而不是数组。

我所能看到的只是我需要以太场为

@Field
public void setDescription(Object description) {
    this.description = (???) description;
}

在哪种情况下如何将其恢复为String?

或者我可以使用org.apache.solr.schema.TextField

@Field
public void setDescription(TextField description) {
    this.description =  description.getValueSource(???, ???);
}

但是我也不太明白如何让String为初学者退出,其次看起来我必须将整个solr库拉入项目,因为TextField对象不在Solrj库中。

我确信我错过了一些东西,所有其他字段都映射得如此简单,但我找不到一个如何将描述作为字符串返回客户端并允许在此字段上进行自由文本搜索的示例,如字符串据我所知,不要允许这种类型的搜索。

任何帮助都很高兴

1 个答案:

答案 0 :(得分:0)

因此,Solr会将TextField默认为多值字段。这意味着Solr用一个Array包装我传入的String字段,这会导致Bean Setter中断,因为Solr想要返回一个带有1个String而不是String的数组。

要解决此问题,只需编辑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。