在数组ElasticSearch

时间:2019-03-26 20:20:36

标签: elasticsearch elasticsearch-6

我正在使用ElasticSearch搜索文档。但是,我需要确保当前用户能够看到这些文档。每个文档都与用户可能所属的社区相关联。

这是我的文档的映射:

export const mapping = {
  properties: {
    amazonId: { type: 'text' },
    title: { type: 'text' },
    subtitle: { type: 'text' },
    description: { type: 'text' },
    createdAt: { type: 'date' },
    updatedAt: { type: 'date' },
    published: { type: 'boolean' },
    communities: { type: 'nested' }
  }
}

我目前正在将文档所属社区的ID保存在字符串数组中。例如:["edd05cd0-0a49-4676-86f4-2db913235371", "672916cf-ee32-4bed-a60f-9a7c08dba04b"]

当前,当我使用{term: { communities: community.id } }过滤查询时,它会返回所有文档,而与绑定的社区无关。

这是完整的查询:

{
  index: 'document',
  filter_path: { filter: {term: { communities: community.id } } },
  body: {
    sort: [{ createdAt: { order: 'asc' } }]
  }
}

这是基于社区"b7d28e7f-7534-406a-981e-ddf147b5015a"的以下结果。 注意:这是我的graphql的返回结果,因此,在解决了ES查询的匹配后,文档上的社区是实际的完整对象。

"hits": [
    {
      "title": "The One True Document",
      "communities": [
        {
          "id": "edd05cd0-0a49-4676-86f4-2db913235371"
        },
        {
          "id": "672916cf-ee32-4bed-a60f-9a7c08dba04b"
        }
      ]
    },
    {
      "title": "Boring Document 1",
      "communities": []
    },
    {
      "title": "Boring Document 2",
      "communities": []
    },
    {
      "title": "Unpublished",
      "communities": [
        {
          "id": "672916cf-ee32-4bed-a60f-9a7c08dba04b"
        }
       ]
    }
]

当我尝试将社区映射为{type: 'keyword', index: 'not_analyzed'}时,收到一条错误消息,指出[illegal_argument_exception] Could not convert [communities.index] to boolean

那么我需要更改映射,过滤器还是同时更改两者?在docs for 6.6周围搜索,我发现terms需要non_analyzed映射。

更新--------------------------

我将社区映射更新为keyword,如下所示。但是,我仍然收到相同的结果。

我将查询更新为以下内容(使用包含文档的社区ID)

query: { index: 'document',
  body: 
   { sort: [ { createdAt: { order: 'asc' } } ],
     from: 0,
     size: 5,
     query: 
      { bool: 
         { filter: 
            { term: { communities: '672916cf-ee32-4bed-a60f-9a7c08dba04b' } } } } } }

哪个给我以下结果:

{
  "data": {
    "communities": [
      {
        "id": "672916cf-ee32-4bed-a60f-9a7c08dba04b",
        "feed": {
          "documents": {
            "hits": []
          }
        }
      }
    ]
  }
}

似乎我的过滤器工作得很好?

1 个答案:

答案 0 :(得分:1)

由于您存储的是社区ID,因此应确保不对ID进行分析。为此,communities的类型应为keyword。其次,您要存储社区ID的数组,因为一个用户可以属于多个社区。为此,您不必使其类型为nestedNested共有不同的用例。 要将值作为数组使用,请确保在索引时始终将值作为数组传递给字段,即使该值是单个值。

您需要更改映射以及针对字段communities索引值的方式。

1。更新映射如下:
PUT my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "amazonId": {
          "type": "text"
        },
        "title": {
          "type": "text"
        },
        "subtitle": {
          "type": "text"
        },
        "description": {
          "type": "text"
        },
        "createdAt": {
          "type": "date"
        },
        "updatedAt": {
          "type": "date"
        },
        "published": {
          "type": "boolean"
        },
        "communities": {
          "type": "keyword"
        }
      }
    }
  }
}
2。将文档添加到索引:
PUT my_index/_doc/1
{
  "title": "The One True Document",
  "communities": [
    "edd05cd0-0a49-4676-86f4-2db913235371",
    "672916cf-ee32-4bed-a60f-9a7c08dba04b"
  ]
}
3。按社区ID过滤:
GET my_index/_doc/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "communities": "672916cf-ee32-4bed-a60f-9a7c08dba04b"
          }
        }
      ]
    }
  }
}

嵌套领域方法

1。映射:
PUT my_index_2
{
  "mappings": {
    "_doc": {
      "properties": {
        "amazonId": {
          "type": "text"
        },
        "title": {
          "type": "text"
        },
        "subtitle": {
          "type": "text"
        },
        "description": {
          "type": "text"
        },
        "createdAt": {
          "type": "date"
        },
        "updatedAt": {
          "type": "date"
        },
        "published": {
          "type": "boolean"
        },
        "communities": {
          "type": "nested"
        }
      }
    }
  }
}
2。索引文件:
PUT my_index_2/_doc/1
{
  "title": "The One True Document",
  "communities": [
    {
      "id": "edd05cd0-0a49-4676-86f4-2db913235371"
    },
    {
      "id": "672916cf-ee32-4bed-a60f-9a7c08dba04b"
    }
  ]
}
3。查询(用于嵌套查询):
GET my_index_2/_doc/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "nested": {
            "path": "communities",
            "query": {
              "term": {
                "communities.id.keyword": "672916cf-ee32-4bed-a60f-9a7c08dba04b"
              }
            }
          }
        }
      ]
    }
  }
}

您可能会注意到我使用的是communities.id.keyword,而不是communities.id。要了解其原因,请遍历this