2016-12-23 2 views
0

Я пытаюсь fake index per user, но мои идентификаторы пользователя - это электронные письма. Когда у меня есть @ в моих псевдонимах, поиск пуст.Существуют ли запрещенные символы для псевдонимов elasticsearch?

Например, если я создаю один индекс my_index и два псевдонима my_alias и [email protected], как показано ниже, поиск my_alias работает отлично, и мой @ лейас не является:

curl -XPUT 'elasticsearch:9200/my_index' 
{"acknowledged":true} 

curl -XPUT 'elasticsearch:9200/my_index/_alias/my_alias -d '{"routing": "my_alias", "filter": {"term": {"doc_id": "my_alias"}}}' 
{"acknowledged":true} 

curl -XPUT 'elasticsearch:9200/my_index/_alias/[email protected]' -d '{"routing": "[email protected]", "filter": {"term": {"doc_id": "[email protected]"}}}' 
{"acknowledged":true} 

curl -XPUT 'elasticsearch:9200/my_alias/doc/1' -d '{doc_id:"my_alias", title: "hello world"}' 
{"_index":"my_index","_type":"doc","_id":"1","_version":1,"_shards":{"total":2,"successful":1,"failed":0},"created":true} 

curl -XPUT 'elasticsearch:9200/[email protected]/doc/2' -d '{doc_id:"[email protected]", title: "hello dude"}' 
{"_index":"my_index","_type":"doc","_id":"2","_version":1,"_shards":{"total":2,"successful":1,"failed":0},"created":true} 

curl -XGET 'elasticsearch:9200/my_alias/doc/_search?pretty=true' -d'{"query": {"match": {"title": "hello"}}}' 
{ 
    "took" : 1, 
    "timed_out" : false, 
    "_shards" : { 
     "total" : 1, 
     "successful" : 1, 
     "failed" : 0 
    }, 
    "hits" : { 
     "total" : 1, 
     "max_score" : 0.19178301, 
     "hits" : [ { 
      "_index" : "my_index", 
      "_type" : "doc", 
      "_id" : "1", 
      "_score" : 0.19178301, 
      "_routing" : "my_alias", 
      "_source" : { 
       "doc_id" : "my_alias", 
       "title" : "hello world" 
      } 
     } ] 
    } 
} 

curl -XGET 'elasticsearch:9200/[email protected]/doc/_search?pretty=true' -d'{"query": {"match": {"title": "hello"}}}' 
{ 
    "took" : 1, 
    "timed_out" : false, 
    "_shards" : { 
     "total" : 1, 
     "successful" : 1, 
     "failed" : 0 
    }, 
    "hits" : { 
     "total" : 0, 
     "max_score" : null, 
     "hits" : [ ] 
    } 
} 

Что меня озадачивает, что нет Invalid Alias Name Exception , и результат поиска в порядке, но пустой.

Я пробовал также с url-кодированием %40: elasticsearch:9200/my%40lias, но это то же самое.

Если я ищу по всему индексу, я вижу два документа. Если я создаю индекс с @, поиск индексов также в порядке. Если я завить _aliases, чтобы увидеть состояние ES можно увидеть:

"my_index" : { 
    "aliases" : { 
    "[email protected]" : { 
     "filter" : { 
     "term" : { 
      "doc_id" : "[email protected]" 
     } 
     }, 
     "index_routing" : "[email protected]", 
     "search_routing" : "[email protected]" 
    }, 
    "my_alias" : { 
     "filter" : { 
     "term" : { 
      "doc_id" : "my_alias" 
     } 
     }, 
     "index_routing" : "my_alias", 
     "search_routing" : "my_alias" 
    } 
    } 
}, 

Видите вы причину такого поведения? Я что-то пропустил?

ответ

0

Вам просто нужно URL-кодировать @ знак, как это:

curl -XGET 'elasticsearch:9200/my%40lias/doc/_search?pretty=true' 
           ^
            | 
          change this 
+0

невного я упомянул, что я попробовал это, но это не проблема кодирования унифицированного либо, я редактирую пост –

+0

Хм, это, возможно, придется делать с как вы используете маршрутизацию. – Val

+0

ну, может быть, но это точно так же, как ссылка выше, и она работает с одним, а не с другим ... –

0

я воспроизвел ваш индекс в моем местном, и я думаю, что проблема у вас есть то, что вы не индексировать документы правильно.

Например, посмотрите на этот запрос:

curl -XPUT 'elasticsearch:9200/my_alias/doc/1' -d '{doc_id:"my_alias", title: "hello world"}' 

Это должно быть

curl -XPUT "http://localhost:9200/my_alias/doc/1" -d' 
{"doc_id":"my_alias", "title": "hello world"}' 

Пожалуйста, обратите внимание на разницу между {doc_id: "my_alias" и { "DOC_ID" : «my_alias»,, так как у вас отсутствуют кавычки для doc_id. Это относится и к названию.

Полного неподвижный пример:

PUT /my_index 
PUT /my_index/_alias/my_alias 
{"routing": "my_alias", "filter": {"term": {"doc_id": "my_alias"}}} 

PUT /my_index/_alias/[email protected] 
{"routing": "[email protected]", "filter": {"term": {"doc_id": "[email protected]"}}} 

PUT /my_alias/doc/1 
{ 
    "doc_id":"my_alias", "title": "hello world" 

} 

PUT /[email protected]/doc/2 
{ 
    "doc_id": "[email protected]", 
    "title": "hello dude" 
} 


GET /my_alias/doc/_search?pretty=true 
{ 
    "query": { 
    "match": { 
     "title": "hello" 
    } 
    } 
} 

{ 
    "took": 2, 
    "timed_out": false, 
    "_shards": { 
    "total": 1, 
    "successful": 1, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 1, 
    "max_score": 0.19178301, 
    "hits": [ 
     { 
     "_index": "my_index", 
     "_type": "doc", 
     "_id": "1", 
     "_score": 0.19178301, 
     "_routing": "my_alias", 
     "_source": { 
      "doc_id": "my_alias", 
      "title": "hello world" 
     } 
     } 
    ] 
    } 
} 
+0

не исправлено вообще, прочитайте вопрос пожалуйста: есть два случая: один с my_alias, который проходит, а другой - с моими лиасами, а это нет. Как бы вы объяснили, что первый пример работает, основываясь на том, что я бы забыл двойные кавычки? –

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