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

Why does Solr creates multiValued field for String in schemaless mode?

我正在尝试使用 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

据我所知,您必须实际定义一个模式才能做到这一点,因为默认情况下,无模式模式(为您猜测并创建模式)中的所有字段都是多值的。

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

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 结构。