2015-03-29 2 views
0

Я пытаюсь отфильтровать термин на объекте (персоне) свойство (имя), но, похоже, не понял, что происходит не так. Если я фильтрую на поле «t», он работает, но я не могу фильтровать объект! Кто-нибудь может помочь!elasticsearch filter on object property

Мой запрос ниже:

"query": { 
    "filtered" : { 
     "filter" : { 
      "term" : { "person.fname" : "JOHN"} 
     }  
    } 

} 

Мое отображение:

{ 
     "_ttl": {"enabled": true, "default": '90d'}, 

     "properties" : { 
      "t": { "type" : "date" }, 

      "person": { "type" : "object", 
        "properties" : { 
         "fname" : { "type" : "string"}, 
         "lname" : { "type" : "string"} 
        } 
      } 

     } 

    } 

Этот документ существует в индексе ...

{ 
    "_index" : "personindex", 
    "_type" : "S", 
    "_id" : "AUxnFFrAGK3sw8tqMMY0", 
    "_score" : 1.0, 
    "_source":{"t":1427658527178,"person":{"fname":"JOHN","lname":"DOE"}} 
} 

ответ

1

Проблема связана с анализом. Поскольку в вашем сопоставлении не указан анализатор, используется standard analyzer. Стандартный анализатор преобразует токены в нижний регистр. Таким образом, термин «john» заканчивается в инвертированном индексе, но термин «JOHN» - нет. Когда вы запускаете запрос term, текст запроса не анализируется, и поскольку ни один документ не соответствует точному термину «JOHN», вы не получаете никаких результатов.

Этот запрос даст вам то, что вы хотите:

{ 
    "query": { 
     "filtered": { 
     "filter": { 
      "term": { 
       "person.fname": "john" 
      } 
     } 
     } 
    } 
} 

Как это один (с анализом match query преформ на текст запроса):

{ 
    "query": { 
     "match": { 
      "person.fname": "JOHN" 
     } 
    } 
} 

В качестве альтернативы, вы можете настроить различного анализатора (или нет) в этом поле, чтобы сделать ваш фильтр условий работы.

Вот код, я использовал, чтобы поиграть с ним:

http://sense.qbox.io/gist/a87bcca08496218b07287d358939c1caed42f047

+0

Человек такой Facepalm !!! спасибо @sloan. – user3658423

+0

Случается для всех нас, человек. ;) –