2017-02-23 52 views
0

У меня есть документы, которые выглядят следующим образом:ElasticSearch: в том числе вложенные поля в _all?

{"foo" : "blah blah blah", 
"bar" : "bla bla bla", 
"baz" : [{"href" : "someid"}, {"href" : "otherid"}, ...], 
... } 

Я хочу, чтобы сделать поиск, который находит все документы, в которых id происходит в одном из href поддокументов. Если я установил baz.href, чтобы быть неанализируемым в сопоставлении, я могу найти baz.href с запросом термина просто.

Однако, я действительно хочу, чтобы иметь возможность искать этот идентификатор независимо от того, где он происходит. Он может быть в baz.href, quux.href, или whatever.href. Поиск в _all будет вполне приемлемым.

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

Я попытался установить include_in_all на baz в картографии, но безрезультатно. Я попытался установить его на baz.href, и это тоже не сработало.

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

Помощь?

Update: Отображение для datasets поля (и во всех других областях, которые содержат href S выглядит следующим образом):

"datasets" : { 
    "properties" : { 
     "href" : { 
     "include_in_all" : true, 
     "index" : "not_analyzed", 
     "type" : "string" 
     } 
    }, 
    "type" : "nested" 
}, 

Я попытался с падением nested, и опуская include_in_all, но это не имеет значения. Когда у меня было nested, я мог бы использовать вложенный запрос, но path должен быть установлен в datasets, потому что * терпит неудачу, так как не все поля содержат вложенные объекты.

ответ

0

С помощью прилагаемого отображения:

$ curl -XPOST 'localhost:9200/datasets/data?pretty=true' -d ' 
{ 
    "datasets" : { 
    "properties" : { 
     "href" : { 
     "include_in_all" : false, 
     "index" : "not_analyzed", 
     "type" : "string" 
     } 
    }, 
    "type" : "nested" 
    } 
}' 

Когда я индексируются эти документы:

$ curl -XPOST 'localhost:9200/datasets/data' -d ' 
{ 
    "foo": "blah blah blah", 
    "bar": "bla bla bla", 
    "baz": [ 
    { 
     "href": "someid" 
    }, 
    { 
     "href": "otherid" 
    } 
    ], 
    "quux": { 
    "href": "thisid" 
    }, 
    "whatever": { 
    "href": "thatid" 
    } 
}' 
$ curl -XPOST 'localhost:9200/datasets/data' -d ' 
{ 
    "foo": "argh argh argh", 
    "bar": "arg arg arg", 
    "baz": [ 
    { 
     "href": "funkyid" 
    }, 
    { 
     "href": "thisid" 
    } 
    ], 
    "quux": { 
    "href": "hipsterid" 
    }, 
    "whatever": { 
    "href": "coolid" 
    } 
}' 

Я был в состоянии правильно искать через HREF полей с:

$ curl -XPOST 'localhost:9200/datasets/data/_search?pretty=true' -d '{ 
    "query": { 
    "query_string": { 
     "query": "thisid", 
     "fields": ["*.href"] 
    } 
    } 
}' 

Итак, нет необходимости индексировать их в поле _all.

Мои испытания проводились на Elasticsearch 5.2.1.

FYI, это то, где я нашел решение вопроса: Searching term in subdocuments with elasticsearch

+0

К сожалению, это не работает для меня. Разница в том, что в моем случае подполе 'href' имеют индекс: not_analyzed', что необходимо, чтобы избежать ложных срабатываний от аналогичных идентификаторов. Я пробовал '* .href' в терминах query, но это не работает.Я также попытался установить 'analyzer: keyword' в запросе' query_string', но это тоже не сработало. Спасибо вам большое за попытку! –

+1

Не могли бы вы сбросить образец отображения, которое вы используете для этого индекса? Это поможет воспроизвести проблему и поможет устранить ее. –

+0

Я снова попробовал ваше предложение с 5.1, и у меня есть результаты поиска, но я получаю слишком много. Я хочу выполнить поиск по ID, но поиск находит значения, похожие, но не идентичные. –

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

  • Нет связанных вопросов^_^