2

我将 elasticsearch-model gem 用于具有has_many关系的模型。为了匹配文档,假设模型是Article并且关系是has_many categories。所以我按如下方式编写了客户序列化程序(直接来自文档):

def as_indexed_json(options={})
  self.as_json(
    include: { categories: { only: :title},
             })
end

序列化似乎有效。示例文章的 as_indexed_json 的结果包含一个"categories" => {"title"=> "one", "title"=> "two", "title"=> "three"}块。

我正在苦苦挣扎并且无法在文档中找到的是如何搜索这个嵌套字段。

这是我尝试过的:

嵌套查询的弹性搜索文档中,我认为它应该如下所示:

r = Article.search query: {
    nested: {
        path: "categories",
        query: {match: {title: "one"}}
    }
}

但是当我这样做时,r.results.first我得到一个错误:nested object under path [categories] is not of nested type]...

我尝试添加将序列化程序中的一行更改为:include: { categories: { type: "nested", only: :title}但这并没有改变任何东西,它仍然说类别不是嵌套类型。

当然,我尝试只查询没有任何嵌套的字段,如下所示:

r = Article.search query: {match: {categories: 'one'}}

但这不会返回任何结果。

全文搜索如下:

r = Article.search query: {match: {_all: 'one'}}

返回结果,但当然我只想在类别字段中搜索“一个”。

任何帮助将非常感激!

4

2 回答 2

0

好的,所以它看起来像:r = Article.search query: {match: {"categories.title" => 'one'}}有效,但我会留下这个问题,以防有人可以解释嵌套的东西发生了什么......

于 2014-10-30T14:47:04.517 回答
0

Rails 不会在 elasticsearch 中创建嵌套映射。Elasticsearch 正在使用动态映射将类别作为对象而不是嵌套子项(“当 Elasticsearch 在文档中遇到以前未知的字段时,它会使用动态映射来确定该字段的数据类型,并自动将新字段添加到类型映射中作为对象而不嵌套它们”)。为了使它们成为嵌套对象,您需要在 elasticsearch 中再次创建映射,并将类别作为嵌套类型,注意类型作为类别的嵌套。

 PUT /my_index 
{
  "mappings": {
    "article": {
      "properties": {
        "categories": {
          "type": "nested", 
          "properties": {
            "name":    { "type": "string"  },
            "comment": { "type": "string"  },
            "age":     { "type": "short"   },
            "stars":   { "type": "short"   },
            "date":    { "type": "date"    }
          }
        }
      }
    }
  }
}

在此之后,您可以重新索引来自客户端的数据,或者如果您想要零停机时间,请在此处阅读。

PS:您必须在创建新索引之前删除特定索引的旧映射。

于 2015-07-23T08:25:53.463 回答