2016-11-08 4 views
1

Я пытаюсь индексировать и искать документы из ядра Solr, используя SolrJ. Ядро Solr работает в режиме схематизации.Почему Solr создает многозначное поле для String в режиме схемы?

У меня есть следующий боб индексировать:

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"/> 

А при попытке получить бобы после поиска он бросает исключение:

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.

ответ

1

Насколько я знаю, вам нужно будет на самом деле определить схему, чтобы сделать это, поскольку все поля в режиме schemaless (который догадывается и создает схему для вас) будут по умолчанию многозначными.

Вы можете сделать это, используя функциональность Add a new field в API-интерфейсе Solr.

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 к внутренней структуре JSON.

+0

Да, поля могут быть добавлены отдельно. Но я ожидал, что поля будут создаваться динамически в схематическом режиме. Кажется, что динамически созданные поля String являются многозначными (строки). –

+0

Все поля, созданные в режиме schemaless, создаются как многозначные. – MatsLindh

Смежные вопросы