当前位置: 首页 > 知识库问答 >
问题:

Solr TextField到Java@Field的映射

华森
2023-03-14

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

我一切正常(Solrj Client能够提交和检索已用@Field annotations注释的域模型),但是我想在域模型的一个字段上使用自由文本搜索,所以我将其类型从字符串更改为文本字段,我的理解是,这将允许一种更自由的文本搜索方式,而不是键:值对类型的搜索,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;
}

保存端工作正常,我能够更新solr vai java bean ans solrj,并使用超文本传输协议客户端,我可以看到数据进入,我的问题是查询时似乎无法将java bean取出。Solr不喜欢基于字符串的setter尝试填充bean。我得到以下错误:

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;
}

在这种情况下,我如何让它回到字符串?

或者我可以使用组织。阿帕奇。索尔。模式。文本字段

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

但我也不太明白如何让字符串重新开始,第二,看起来我必须把整个solr库拉到项目中,因为TextField对象不在Solrj库中。

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

非常感谢您的帮助

共有1个答案

戎鹏云
2023-03-14

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

要解决这个问题,只需编辑您的Schema.xml文件,并明确告诉Solrtext_general是单个值,因此在我的情况下,描述字段

从这:

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

为此:

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

现在Solr很高兴地将我的响应转换为它的组件JavaBean。

 类似资料:
  • 卡桑德拉表列: Java实体: 当执行从表列“pickuploc”中选择查询时,并没有完全映射到实体中定义的picupLocal属性。 这是我得到的回应: 使用Spring数据卡桑德拉1.5.8

  • 问题内容: 当我用Java进行操作时,我在stdout中得到了很好的输出。在不干预标准输出的情况下,如何在变量中获得相同的a字符串表示形式?像什么? 问题答案: 使用。 所有的亦是在此之后是做头套下。地图的格式在中描述。 返回此映射的字符串表示形式。字符串表示形式由键值映射列表组成,这些键值映射由地图视图的迭代器返回,并用大括号(“ {}”)括起来。相邻的映射用字符“,”(逗号和空格)分隔。每个键

  • 表单编辑器。 引入 import { Field } from 'mint-ui'; Vue.component(Field.name, Field); 例子 基础用法 <mt-field label="用户名" placeholder="请输入用户名" v-model="username"></mt-field> <mt-field label="邮箱" placeholder="请输入邮箱

  • 介绍 (Introduction) java.lang.reflect.Field类提供有关类或接口的单个​​字段的信息和动态访问。 反射字段可以是类(静态)字段或实例字段。 Field允许在get或set访问操作期间进行扩展转换,但如果发生收缩转换则抛出IllegalArgumentException。 类声明 以下是java.lang.reflect.Field类的声明 - public fi

  • 字段是索引过程的最低单位或起点。 它表示键值对关系,其中键用于标识要编制索引的值。 假设用于表示文档内容的字段将具有作为“内容”的键,并且该值可以包含文档的部分或全部文本或数字内容。 Lucene只能索引文本或数字内容。 此类表示索引的存储位置,通常是文件列表。 这些文件称为索引文件。 索引文件通常只创建一次,然后用于读取操作或可以删除​​。 Class 声明 (Class Declaration

  • field方法主要作用是标识要返回或者操作的字段,可以用于查询和写入操作。 用于查询 指定字段 在查询操作中field方法是使用最频繁的。 Db::table('think_user')->field('id,title,content')->select(); 这里使用field方法指定了查询的结果集中包含id,title,content三个字段的值。执行的SQL相当于: SELECT id,t