2013-08-26 1 views
3

Я использую префикс для запроса elasticsearch. Он отлично работает при использовании его на данных верхнего уровня, но после применения к вложенным данным результаты не возвращаются. Данные, которые я пытаюсь запроса выглядит следующим образом:Elicsearch Префиксный запрос не работает с вложенными документами

Здесь префикс запрос работает нормально: Запрос:

{ "query": { "prefix" : { "duration": "7"} } } 

Результат:

{ 
    "took": 25, ... }, 
    "hits": { 
     "total": 6, 
     "max_score": 1, 
     "hits": [ 
     { 
     "_index": "itemresults", 
     "_type": "itemresult", 
     "_id": "ITEM_RESULT_7c8649c2-6cb0-487e-bb3c-c4bf0ad28a90_8bce0a3f-f951-4a01-94b5-b55dea1a2752_7c965241-ad0a-4a83-a400-0be84daab0a9_61", 
     "_score": 1, 
     "_source": { 
      "score": 1, 
      "studentId": "61", 
      "timestamp": 1377399320017, 
      "groupIdentifiers": {}, 
      "assessmentItemId": "7c965241-ad0a-4a83-a400-0be84daab0a9", 
      "answered": true, 
      "duration": "7.078", 
      "metadata": { 
       "Korrektur": "a", 
       "Matrize12_13": "MA.1.B.1.d.1", 
       "Kompetenz": "ZuV", 
       "Zyklus": "Z2", 
       "Schwierigkeit": "H", 
       "Handlungsaspekt": "AuE", 
       "Fach": "MA", 
       "Aufgabentyp": "L" 
      }, 
      "assessmentSessionId": "7c8649c2-6cb0-487e-bb3c-c4bf0ad28a90", 
      "assessmentId": "8bce0a3f-f951-4a01-94b5-b55dea1a2752" 
     } 
    }, 

Теперь пытается использовать префикс запрос на применение метаданных вложенной структуры не возвращает никакого результата:

{ "query": { "prefix" : { "metadata.Fach": "M"} } } 

Результат:

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

Что я делаю неправильно? Возможно ли применить префикс на вложенные данные?

ответ

6

Не зависит от того, вложен или нет. Это зависит от вашего сопоставления, если вы анализируете строку во время индекса или нет.

Я собираюсь поставить пример:

Я создал и индекс с последующим отображением:

curl -XPUT 'http://localhost:9200/test/' -d ' 
{ 
    "mappings": { 

    "test" : { 
     "properties" : { 
     "text_1" : { 
      "type" : "string", 
      "index" : "analyzed" 
     }, 
     "text_2" : { 
      "index": "not_analyzed", 
      "type" : "string" 
     } 
     } 
    } 
    } 
}' 

В основном 2 текстовых поля, один проанализирован и другой not_analyzed. Теперь индекс следующий документ:

curl -XPUT 'http://localhost:9200/test/test/1' -d ' 
{ 
"text_1" : "Hello world", 
"text_2" : "Hello world" 
}' 

text_1 запрос

В text_1 анализируется одна из вещей, которые elasticsearch делает для преобразования поля в нижнем регистре. Так что, если я делаю следующий запрос не находит какого-либо документа:

curl -XGET 'http://localhost:9200/test/test/_search?pretty=true' -d ' 
{ "query": { "prefix" : { "text_1": "H"} } } 
' 
{ 
    "took" : 2, 
    "timed_out" : false, 
    "_shards" : { 
    "total" : 5, 
    "successful" : 5, 
    "failed" : 0 
    }, 
    "hits" : { 
    "total" : 0, 
    "max_score" : null, 
    "hits" : [ ] 
    } 
} 

Но если я сделать трюк и использовать нижний регистр для создания запроса:

curl -XGET 'http://localhost:9200/test/test/_search?pretty=true' -d ' 
{ "query": { "prefix" : { "text_1": "h"} } } 
' 
{ 
    "took" : 2, 
    "timed_out" : false, 
    "_shards" : { 
    "total" : 5, 
    "successful" : 5, 
    "failed" : 0 
    }, 
    "hits" : { 
    "total" : 1, 
    "max_score" : 1.0, 
    "hits" : [ { 
     "_index" : "test", 
     "_type" : "test", 
     "_id" : "1", 
     "_score" : 1.0, "_source" : 
{ 
"text_1" : "Hello world", 
"text_2" : "Hello world" 
} 
    } ] 
    } 
} 

text_2 запрос

Поскольку текст_2 не анализируется, когда я делаю исходный запрос, он соответствует:

curl -XGET 'http://localhost:9200/test/test/_search?pretty=true' -d ' 
{ "query": { "prefix" : { "text_2": "H"} } } 
' 
{ 
    "took" : 1, 
    "timed_out" : false, 
    "_shards" : { 
    "total" : 5, 
    "successful" : 5, 
    "failed" : 0 
    }, 
    "hits" : { 
    "total" : 1, 
    "max_score" : 1.0, 
    "hits" : [ { 
     "_index" : "test", 
     "_type" : "test", 
     "_id" : "1", 
     "_score" : 1.0, "_source" : 
{ 
"text_1" : "Hello world", 
"text_2" : "Hello world" 
} 
    } ] 
    } 
}