How do I index an _id with + symbol?

(Scott) #1

Making the switch from ES2 to ES6 and having a serious problem. Whenever I index a record with an id that contains a + symbol, Elasticsearch replaces the + with a space. The “id” field is correct, but the “_id” field contains a space.

Later, when I search for data and retrieve the key, I have a mismatch in my document store (dynamo) because the + have been replaced. In other words, by modifying the primary key used across databases, it makes it difficult to link the records.

Is it possible to escape the + so that _id is stored with the value I want? I’ve tried \ + or %2B for the +, and other variations but it does not work. I also tried changing the mapping on the index but nothing seems to work and I got an error trying to change _id field to a keyword.

Any tips for this? It seems like such a simple thing to store a symbol as part of the string, but ES6 is making it painful.

Not sure if it matters, but I’m using the Java Rest 6 client for all operations. Below is simple sample code to reproduce this:

RestHighLevelClient client = new RestHighLevelClient(...);
IndexRequest request = new IndexRequest("test", "test", "+1234");
request.source("{}", XContentType.JSON);

And the data in ES:

GET test/_search
  "took": 4,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
	"_index": "test",
	"_type": "test",
	"_id": " 1234",
	"_score": 1,
	"_source": {}

Note the space and lack of + in the "_id" field.

(Christoph) #2

Which version of Elasticsearch 6 are you using specifially, I'll try to see if this still happens in the latest 6.4 version.

(Christoph) #3

Hah, the "+" sign seems to be a special snowflake for a while:

I tried the %2b encoding in the Kibana Console and it works as a workaround at least there:

PUT /test/_doc/%2b1234
  "foo" : "bar"

GET /test/_search

GET /test/_search
  "query": {
    "ids": {
      "values": ["+1234"]

Still need to try this with the Java HL Rest client though.

(Christoph) #4

There already seems to be an open issue for this in relation with the HL Rest client. Doesn't seem to be merged yet though unfortunately:

(Scott) #5

I'm running ES 6.3.2 and I tried using the DevTools console to reproduce your work. Unfortunately, I don't get the results you posted with using %2b instead of +. Instead, it shows the _id having a space. Is this something they fixed after 6.3.2?

(Scott) #6

I installed a 6.4.2 version and can confirm the following:

  1. There is a server-side issue in 6.3.2 that automatically sets + to a space using Dev Tools. This is fixed in 6.4.2.

  2. In 6.4.2, you still can't actually pass a + even using Dev Tools. You still have to pass %2b instead of +.

  3. Using 6.4.2, there is a bug in the High-Level Rest Client that does not +'s to be used, whether they be passed as %2b or + that has not been merged into the repo.

In other words, to fix this using a low-level client, you need to be running at least 6.4.2. To fix this with the high-level client, have to wait for at least 6.5.0 or future when the issue is closed.

Sigh... I hate work-arounds but I guess I'll to do something stupid until this is fixed in the appropriate places.

(Christoph) #7

Sorry for the inconvenience and for hanging in there.

(system) #8

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.