为什么Solr在无模式模式下为String创建multiValued字段?

时间:2016-11-08 13:12:25

标签: java solr solrj

我正在尝试使用SolrJ索引和搜索来自Solr核心的文档。 Solr核心在无模式模式下运行。

我有以下bean来索引:

public class Product {


    @Field("id")
    private String id;


    @Field(value="name")
    private String name;


    @Field(value="category")
    private String category;


    @Field(value="description")
    private String description;
    ...
}

为文档编制索引时,它会在托管架构中创建multiValued字段strings

Product p = new Product();
p.setId("0001");
p.setName("Cat 1");
p.setDescription("Description");

SolrClient client = new  
 HttpSolrClient("http://localhost:8983/solr/product");
client.addBean(p);
client.commit();

managed-schema中动态创建多值字段集:

 <field name="category" type="strings"/>
 <field name="description" type="strings"/>
 <field name="name" type="strings"/>

当在搜索之后尝试获取bean时抛出异常:

 SolrQuery query = new SolrQuery();
 query.set("q", "*:*");
 QueryResponse response = client.query(query);
 List<Product> products = response.getBeans(Product.class);

例外:

java.lang.IllegalArgumentException: 
 Can not set java.lang.String field Product.name to java.util.ArrayList

如何解决此问题并让Solr创建单值字段?

我正在使用solr-6.2.1solr-solrj-5.5.0.jar

1 个答案:

答案 0 :(得分:1)

据我所知,您必须实际定义一个模式来执行此操作,因为默认情况下,无模式模式中的所有字段(为您猜测并创建模式)都将是多值的。

您可以使用Solr Schema API中的Add a new field功能来执行此操作。

curl -X POST -H 'Content-type:application/json' --data-binary '{
  "add-field":{
     "name":"category",
     "type":"strings",
     "stored":true }
}' http://localhost:8983/solr/collection/schema

..默认情况下,在添加字段时,multivalued为false,因此您不需要添加,但如果这样做,请将"multiValued":false附加到内部JSON结构。