2016-11-08 4 views
1

SolrJを使用してSolrコアから文書を索引付けして検索しようとしています。 Solrコアは、スキルレスモードで実行されています。SolrはスキーマレスモードでStringのmultiValuedフィールドを作成するのはなぜですか?

私は、インデックスを次のように豆いる:

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を作成します:動的 managed-schema内のフィールドのMULT値のセットを作成します

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(); 

を:

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

そして、それは例外をスロー検索した後に豆を取得しよう:

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

スキルレスモードのすべてのフィールド(あなたのためにスキーマを推測して作成する)がデフォルトで複数値になるため、実際にスキーマを定義する必要があります。

これは、Solr Schema APIのAdd a new field機能を使用して行うことができます。フィールドを追加するとき、あなたがそれを追加する必要がありますが、あなたがしなければ、内部JSON構造に"multiValued":falseを追加するべきではありませんので

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

...多値は、デフォルトではfalseです。

+0

はい、フィールドは別々に追加できます。しかし、私はスキルレスモードでフィールドを動的に作成することを期待していました。動的に作成されたStringフィールドは、複数値(文字列)のようです。 –

+0

スキーマレスモードで作成されたすべてのフィールドは、複数値として作成されます。 – MatsLindh

関連する問題