2016-02-09 3 views
0

У меня есть этот индекс blog со следующими settings и mappings.Оценка функции на вложенном объекте

PUT /blog 
{ 
    "settings": { 
    "index": { 
     "number_of_shards": "1" 
    } 
    }, 
    "mappings": { 
    "post": { 
     "_all": { 
     "enabled": false 
     }, 
     "properties": { 
     "title": { 
      "type": "string" 
     }, 
     "content": { 
      "type": "string" 
     }, 
     "visitor": { 
      "type": "nested", 
      "properties": { 
      "id": { 
       "type": "string", 
       "index": "not_analyzed" 
      }, 
      "last_visit": { 
       "type": "date", 
       "format": "yyyy-MM-dd" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

Я хочу оценивать свои должности на основе релевантности и последнего посещения посетителя. Я пробовал этот запрос без успеха. Кажется, что функция gauss не может получить значение visitor's last_visit. Как это сделать?

POST /blog/post/_search 
{ 
    "query": { 
    "function_score": { 
     "functions": [ 
     { 
      "gauss": { 
      "visitor.last_visit": { 
       "origin": "now/d", 
       "offset": "3d", 
       "scale": "4d", 
       "decay": 0.5 
      } 
      }, 
      "filter": { 
      "nested": { 
       "path": "visitor", 
       "query": { 
       "term": { 
        "visitor.id": "1" 
       } 
       } 
      } 
      } 
     } 
     ] 
    } 
    } 
} 
+0

Вы получаете сообщение об ошибке при запуске этого запроса? или это просто не дает результатов, на которые вы надеялись? – chester89

+0

@ chester89 У меня не было ошибок. Когда я прочитаю объяснение, он не использует 'last'visit'' visitor', он всегда использует '0.0'. Я подозрительно, что он не мог получить значение. – shankshera

+0

Я предлагаю вам сначала попробовать ваш запрос в не-вложенном поле. если это работает, может быть проблема с вложенным полем – chester89

ответ

0

Вот запрос с совпадением имени, в котором используется вложенный объект, который у меня был для конкретного случая использования. Я не использовал поля даты, но, как я уже сказал, он использует вложенный объект. Я использовал релевантность расстояния и текстовое совпадение, так что это похоже.

Я использовал ответ из этого вопроса, чтобы структурировать свой запрос, поскольку он соответствовал тому, что я пытался сделать. Scoring documents by text match and distance

GET dev_search_core_data/_search?size=200 
{ 
    "query": { 
    "bool": { 
     "should": [ 
     { 
      "match": { 
      "NAME": "Amy Smith" 
      } 
     }, 
     { 
      "bool": { 
      "must": [ 
       { 
       "function_score": { 
        "query": { 
        "nested": { 
         "path": "LOCATION", 
         "query": { 
         "term": { 
          "LOCATION.SOME_IND": { 
          "value": true 
          } 
         } 
         } 
        } 
        }, 
        "functions": [ 
        { 
         "gauss": { 
         "LOCATION.COORDINATES": { 
          "origin": "-118.309, 34.041", 
          "scale": "50km", 
          "offset": "10km", 
          "decay": 0.5 
         } 
         } 
        } 
        ] 
       } 
       } 
      ] 
      } 
     } 
     ] 
    } 
    } 
} 

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

GET dev_search_core_data/_validate/query?explain 

Это результат:

{ 
    "valid": true, 
    "_shards": { 
     "total": 1, 
     "successful": 1, 
     "failed": 0 
    }, 
    "explanations": [ 
     { 
     "index": "dev_search_core_data_b", 
     "valid": true, 
     "explanation": "filtered((NAME:amy NAME:smith) (+function score (ToParentBlockJoinQuery (filtered(LOCATION.SOME_IND:true)->random_access(_type:_LOCATION)),function=org.elasticsearch.index.qu[email protected]274227b9)))->cache([email protected]a6)" 
     } 
    ] 
} 

Я также посмотрел на документы для объяснения углубленном как function score работал. Вы не упомянули свою версию, но я использую ES 1.6.