2013-09-05 5 views
3

Я хочу, чтобы захватить все документы с loId=6И(actionType = "SAVE_DATA"ИЛИactionType = "OPEN_SCREEN").Как правильно написать логическое или логическое в elasticsearch?

Я неправильно пишу эту логику?

Почему мой запрос возвращает 0 результатов?

Примечание: Я бы принял запрос или фильтр для решения этой проблемы.

Вот некоторые образцы документов:

{ 
    "_index": "logs", 
    "_type": "record", 
    "_id": "eIIt3vtrSxmdOVGClQmN3w", 
    "_score": 1, 
    "_source": { 
     "timestamp": 1373569919000, 
     "uid": 6, 
     "paId": 56298, 
     "loId": 6, 
     "prId": 2, 
     "vId": 6577, 
     "actionType": "SAVE_DATA" 
    } 
}, 
{ 
    "_index": "logs", 
    "_type": "record", 
    "_id": "yQGCia6qRYCImZLyH7DrEA", 
    "_score": 1, 
    "_source": { 
     "timestamp": 1373570314000, 
     "uid": 6, 
     "paId": 56641, 
     "loId": 6, 
     "prId": 2, 
     "vId": 6578, 
     "actionType": "CHECK_IN" 
    } 
}, 
{ 
    "_index": "logs", 
    "_type": "record", 
    "_id": "2raajrNKTKeRKG88wiNPpw", 
    "_score": 1, 
    "_source": { 
     "timestamp": 1373570532000, 
     "uid": 6, 
     "paId": 56641, 
     "loId": 6, 
     "prId": 2, 
     "vId": 6579, 
     "actionType": "LOAD_DATA" 
    } 
}, 
{ 
    "_index": "logs", 
    "_type": "record", 
    "_id": "0FDBxW2ESl6tfmj81YJvIg", 
    "_score": 1, 
    "_source": { 
     "timestamp": 1373570761000, 
     "uid": 6, 
     "paId": 56298, 
     "loId": 6, 
     "prId": 2, 
     "vId": 6577, 
     "actionType": "OPEN_SCREEN" 
    } 
}, 
{ 
    "_index": "logs", 
    "_type": "record", 
    "_id": "-bFQyEdCQVWiXNldtxz04g", 
    "_score": 1, 
    "_source": { 
     "timestamp": 1373570777000, 
     "uid": 6, 
     "paId": 56298, 
     "loId": 6, 
     "prId": 2, 
     "vId": 6577, 
     "actionType": "OPEN_SCREEN" 
    } 
} 

Запрос

{ 
    "query": { 
     "filtered": { 
      "query": { 
       "term": { 
        "loId": 6 
       } 
      }, 
     "filter": { 
      "or": { 
       "filters": [ 
        { 
        "term": { 
         "actionType": "SAVE_DATA" 
        } 
        }, 
        { 
        "term": { 
         "actionType": "OPEN_SCREEN" 
        } 
        } 
       ], 
       "_cache": false 
      } 
     } 
     } 
    } 
} 

ответ

6

Основная причина у вас возникли проблемы с получением результатов, потому что вы пытаетесь сделать term фильтр actionType , который является анализируемым полем. Если вы хотите сделать term в этом поле, вам необходимо обновить сопоставление типов, чтобы установить это поле в not_analyzed. Смотрите этот пример отображения:

{ 
    "record": { 
     "properties": { 
     "actionType": { 
      "type": "string", 
      "index": "not_analyzed", 
     }, 
     "loId": { 
      "type": "long" 
     }, 
     "paId": { 
      "type": "long" 
     }, 
     "prId": { 
      "type": "long" 
     }, 
     "timestamp": { 
      "type": "long" 
     }, 
     "uid": { 
      "type": "long" 
     }, 
     "vId": { 
      "type": "long" 
     } 
     } 
    } 
} 

Читать на отображениях, начиная здесь: http://www.elasticsearch.org/guide/reference/mapping/. Вам нужно будет переиндексировать свои данные. С этим исправленным, вот запрос, который будет работать:

{ 
    "query": { 
     "filtered": { 
      "query": {"match_all":{}}, 
      "filter": { 
       "bool": { 
        "must": [ 
         {"term": {"loId":6}}, 
         { 
          "or": [ 
           {"term":{"actionType": "SAVE_DATA"}}, 
           {"term":{"actionType": "OPEN_SCREEN"}} 
          ] 
         } 
        ] 
       } 
      } 
     } 
    } 
} 
+0

Спасибо, Джеймс. Это была именно эта проблема. Думаю, я пропустил этот бит, когда прочитал документацию. – Churro

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