2015-07-24 2 views
1

Я вставил документ с полем raw_id, равным 1.2.3.04ABC, и я пытаюсь построить запрос регулярного выражения для поиска документа в ES. Я использую следующий запрос:Buggy Regexp Query in ElasticSearch

curl -X POST 'http://localhost:9200/hello/world/_search' -d '{ 
"query": { 
    "regexp": { 
     "raw_id": "1\\.2\\.3\\.04ABC" 
     } 
    } 
}' 

Это возвращает результат пустой результат

{ 
    "took":1, 
    "timed_out":false, 
    "_shards": { 
     "total":5, 
     "successful":5, 
     "failed":0 
    }, 
    "hits": { 
     "total":0, 
     "max_score":null, 
     "hits":[] 
    } 
} 

С другой стороны, когда я использую слегка измененный запрос

curl -X POST 'http://localhost:9200/hello/world/_search' -d '{ 
"query": { 
    "regexp": { 
     "raw_id": "1\\.2\\.3.*" 
     } 
    } 
}' 

Я получаю непустой:

{ 
    "_shards": { 
     "failed": 0, 
     "successful": 5, 
     "total": 5 
    }, 
    "hits": { 
     "hits": [ 
      { 
       "_id": "adfafadfafa", 
       "_index": "hello", 
       "_score": 1.0, 
       "_source": { 
        "raw_id": "1.2.3.04ABC" 
       }, 
       "_type": "world" 
      } 
     ], 
     "max_score": 1.0, 
     "total": 1 
    }, 
    "timed_out": false, 
    "took": 2 
} 

Может кто-то, пожалуйста, помогите мне понять, почему первый запрос не работает?

+1

Не будет лгать, согласно документации, которые должны работать. Единственное, что я могу вспомнить, - это индексирование регулярных выражений, которое не используется для 'raw_id'. – brandonscript

ответ

1

Я думаю, что ваше поле raw_id является анализируемой строкой, а должно быть not_analyzed. Я использовал следующее отображение с одной анализируемой строкового поля id и другое поле not_analyzed строку raw_id:

curl -XPUT 'http://localhost:9200/hello' -d '{ 
    "mappings": { 
    "world": { 
     "properties": { 
     "id": { 
      "type": "string" 
     }, 
     "raw_id": { 
      "type": "string", 
      "index": "not_analyzed" 
     } 
     } 
    } 
    } 
}' 

Тогда я индексированную следующий документ:

curl -XPUT 'http://localhost:9200/hello/world/1' -d '{ 
    "id": "1.2.3.04ABC", 
    "raw_id": "1.2.3.04ABC" 
}' 

Теперь, принимая запрос выше, если Я ищу против id поля, я не получаю хитов:

curl -XPOST 'http://localhost:9200/hello/world/_search' -d '{ 
"query": { 
    "regexp": { 
     "id": "1\\.2\\.3\\.04ABC" 
     } 
    } 
}' 
=> 0 hits KO 

Однако я получаю один привет т при поиске против raw_id поля:

curl -XPOST 'http://localhost:9200/hello/world/_search' -d '{ 
"query": { 
    "regexp": { 
     "raw_id": "1\\.2\\.3\\.04ABC" 
     } 
    } 
}' 
=> 1 hit OK 

С вашим вторым запросом я получаю удар с каждым полем:

curl -XPOST 'http://localhost:9200/hello/world/_search' -d '{ 
"query": { 
    "regexp": { 
     "id": "1\\.2\\.3.*" 
     } 
    } 
}' 
=> 1 hit OK 

curl -XPOST 'http://localhost:9200/hello/world/_search' -d '{ 
"query": { 
    "regexp": { 
     "raw_id": "1\\.2\\.3.*" 
     } 
    } 
}' 
=> 1 hit OK