Jayavardhan Gange
Jayavardhan Gange

Reputation: 305

Apache Solr - Document is missing mandatory uniqueKey field: id

I'm using Solr7.1 (SolrCloud mode) and I don't have requirement to enforce document uniqueness. Hence I marked id field (designated as unique key) in schema as required="false".

<field name="id" type="string" indexed="true" stored="false" required="false" multiValued="false" />

<uniqueKey>id</uniqueKey>

And I am trying to index some documents using solr Admin UI and I am trying without specifying 'id' field.

{ "cat": "books", "name": "JayStore" } I was expecting it to index successfully but solr is throwing error saying 'mandatory unique key field id is missing'

Could some one guide me what I'm doing wrong.

Upvotes: 3

Views: 2853

Answers (1)

MatsLindh
MatsLindh

Reputation: 52802

The uniqueKey field is required internally by Solr for certain features, such as using cursorMark - meaning that the field that is defined as a uniqueKey is required. It's also used for routing etc. inside SolrCloud by default (IIRC), so if it's not present Solr won't be able to shard your documents correctly. Setting it as not required in the schema won't relax that requirement.

But you can work around this by defining an UUID field, and using a UUID Update Processor as described in the old wiki. This will generate a unique UUID for each document when you index it, meaning each document will get a unique identificator attached by default.

UUID is short for Universal Unique IDentifier. The UUID standard RFC-4122 includes several types of UUID with different input formats. There is a UUID field type (called UUIDField) in Solr 1.4 which implements version 4. Fields are defined in the schema.xml file with:

<fieldType name="uuid" class="solr.UUIDField" indexed="true" />

in Solr 4, this field must be populated via solr.UUIDUpdateProcessorFactory.

<field name="id" type="uuid" indexed="true" stored="true" required="true"/> <updateRequestProcessorChain name="uuid"> <processor class="solr.UUIDUpdateProcessorFactory"> <str name="fieldName">id</str> </processor> <processor class="solr.RunUpdateProcessorFactory" / </updateRequestProcessorChain>

Upvotes: 3

Related Questions