使用elasticsearch-rails将多个字段映射到一个索引

时间:2014-12-17 06:19:06

标签: ruby-on-rails elasticsearch

如何将以下三个字段映射到一个名为“entity”的索引?以下代码仅导致三个中的第一个的索引。目标是能够将这三个字段中的任何一个作为“实体”进行查询。

  indexes :thing1, index_name: "entity" do
    indexes :name, type: 'string', boost: 1.0
  end

  indexes :thing2, index_name: "entity" do
    indexes :name, type: 'string', boost: 2.0
  end

  indexes :thing3, index_name: "entity" do
    indexes :name, type: 'string', boost: 0.2
  end

2 个答案:

答案 0 :(得分:2)

查看Multi-field mapping

"title": {
    "type": "string",
    "fields": {
        "raw":   { "type": "string", "index": "not_analyzed" }
    }
}

答案 1 :(得分:2)

我希望我理解你的问题。

如果您想要的是一个名为“entity”的索引,您将索引三种文档类型“thing1”,“thing2”和“thing3”;并且每个文档类型都被映射为具有名为“name”的属性,那么您的设置可能是正确的(我不知道ruby接口)。 您只需将搜索查询发布到索引“实体”,无需指定文档类型或指定要搜索的所有类型。

您的查询正文会将“名称”字段指定为术语/匹配/无论目标。

{ 
    "query": {
        "match" : {
            "name" : "Happy the Client"
        }
    }
}

请参阅此处以在搜索网址中指定多个索引/类型: http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/multi-index-multi-type.html

搜索所有指数中的所有类型

http://localhost:9200/_search

搜索索引“实体”中的所有类型:

http://localhost:9200/entity/_search

在索引“entity”中搜索指定的类型:

http://localhost:9200/entity/thing1,thing2,thing3/_search

或者也许(如果你没有想要省略的东西4):

http://localhost:9200/entity/thing*/_search

您将在上面的链接中注意到,即使您将它们放在不同的索引中,您也可以实现使用单个查询搜索多个文档类型的目标。如果每个文档类型实际上仅在名称与类型名称匹配的索引中进行索引,则可以向这些URL发送相同的“名称”查询:

搜索所有指数中的所有类型:

http://localhost:9200/_search

搜索指定索引中的所有类型:

http://localhost:9200/thing1,thing2,thing3/_search

在指定的索引中搜索指定的类型:

http://localhost:9200/thing1,thing2,thing3/thing1,thing2,thing3/_search

在所有索引中搜索指定的类型:

http://localhost:9200/_all/thing1,thing2,thing3/_search

在我认为你描述的场景中,你有一个方便的事实,即你的每个文档类型都有一个共同的属性名称“name”。

如果您人为地提供了约束来简化问题,我想触及另一个功能。 假设每种文档类型的属性名称都不同。 类型“thing1”具有字符串属性“name1”,类型“thing2”具有字符串属性“name2”,类型“thing3”具有字符串属性“name3”。 我们希望有一个像上面这样的常见查询来搜索所有这些类型。

{ 
    "query": {
        "match" : {
            "name" : "Happy the Client"
        }
    }
}

为此,有“copy_to”功能: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-core-types.html#copy-to

场景中的映射看起来像这样:

{
  "thing1" : {
    "properties" : {
      "name1" : { "type" : "string", "copy_to" : "name" },
      "name" : { "type" : "string" }
    }
}

{
  "thing2" : {
    "properties" : {
      "name2" : { "type" : "string", "copy_to" : "name" },
      "name" : { "type" : "string" }
    }
}

{
  "thing3" : {
    "properties" : {
      "name3" : { "type" : "string", "copy_to" : "name" },
      "name" : { "type" : "string" }
    }
}

搜索网址将按照与上述相同的指导方针形成。