elasticsearch Elasticsearch中的对象搜索数组
我将调查结果存储在ES中,因此人们使用移动应用程序填写调查表格。这些表格结果发送到后端,然后存储在ES中,就像这样,表格中问题的答案就是这样存储的
elasticsearch Elasticsearch中的对象搜索数组,
elasticsearch,
elasticsearch,我将调查结果存储在ES中,因此人们使用移动应用程序填写调查表格。这些表格结果发送到后端,然后存储在ES中,就像这样,表格中问题的答案就是这样存储的 answers { "uKeCywV4SAgD8YGReSkn" : { "_id" : "b465de5e-5468-40fe-8a8d-fc02083", "responseVersionNumber" : 1, "options" : [
answers {
"uKeCywV4SAgD8YGReSkn" : {
"_id" : "b465de5e-5468-40fe-8a8d-fc02083",
"responseVersionNumber" : 1,
"options" : [
{
"id" : "32700fb5-51d2-4617-b65f-831b83c88080"
},
{
"id" : "32700fb5-51d2-4617-b65f-831b83c87777"
}
}
答案文档在其问题ID下包含每个问题的答案。您在下面看到的字符串是问题ID,与此相同,所有其他答案都存储在相应的for doc中相应问题ID下的ES中,用于该响应
现在我想搜索这些答案,上面的答案响应是mcq multi-select类型,因为您可以看到包含答案值的文本字段,即用户的爱好园艺和运动以及选项id数组都可以用于此,我可以将我的web应用程序中的选项id数组发送到ES或文本值或我们所称的选项标签,也可以使用问题id,例如,假设我有一个id为q1的问题,我希望我的查询告诉我问题q1同时有答案a1和a2的文档
我一直想探索options-id方法这是我为其构建的一个示例查询
{
"_source": {"includes": ["answers.uKeCywV4SAgD8YGReSkn.text", "answers.uKeCywV4SAgD8YGReSkn.questionTypeCode"]},
"query": {
"bool": {
"filter": [{
"bool": {
"must": [{
"match": {
"answers.uKeCywV4SAgD8YGReSkn.options.id": "32700fb5-51d2-4617-b65f-831b83c88080"
}
},
{
"match": {
"answers.uKeCywV4SAgD8YGReSkn.options.id": "32700fb5-51d2-4617-b65f-831b83c87777"
}
}
]
}
}, {
"match": {
"formId": "hHhcLKh9st1vFr8nDY4a"
}
}, {
"range": {
"_updated_at": {
"from": "1970-01-01T00:00:00.000+0000",
"include_lower": true,
"include_upper": true,
"to": null
}
}
}]
}
}
}
我想知道使用这种方法而不是使用两个选项标签搜索文本字段是否有任何缺点
根据映射,这是两个字段的设置方式
"questionId": {
"type": "keyword",
"index": false
},
"text": {
"type": "text"
},
"options": {
"enabled": false
},
你的问题有点难理解。。。但这对我来说可能太早了:我不太明白options id字段在这里应该做什么。您的答案是否用于多个问题?或者你的答案有多种选择吗?如果是这样,为什么用户也可以用文本回复?另外,为什么要将所有字段深入到文档的两个级别?为什么不干脆把它们放平?将字段命名为questionID似乎很麻烦 虽然我不太确定你在问什么,但我可以提出一些可能有用的建议 我最近一直在玩Elasticsearch,特别是嵌套对象数组。您可能要查找的是嵌套数据类型。我强烈建议你读一下这本书 简而言之,它将允许您将选项ID存储为嵌套对象,这些对象可以使用自己的选项ID进行查询。这是在嵌套对象上完成搜索的最简单方法 首先,您需要指定映射以告知Elasticsearch选项是嵌套数据类型:
PUT INDEX_NAME
{
"mappings": {
"DOCUMENT_TYPE": {
"properties": {
"options": {"type": "nested"}
}
}
}
}
然后,在为文档编制索引后,可以使用嵌套查询来查询字段。例如,如果您想要选项ID_123的所有答案:
GET INDEX_NAME/_search
{
"query": {
"nested": {
"path": "options",
"query": {
"match": {
"options.id.keyword": "ID_123"
}
}
}
}
}
您还可以bool嵌套查询以添加更多参数,例如,如果您希望每个答案都包含一个选项ID,该ID在过去一天中也已更新
我希望这在某种程度上有所帮助。如果没有,请尝试更清楚地描述您正在尝试做的事情: