为什么 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.1
和 solr-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 结构。
我正在尝试使用 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.1
和 solr-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 结构。