1

语境

本质上,我拥有的是一个大型的姓名数据集,分为 pty_firstname 和 pty_surname。我将这些数据从 Informix DB 索引到 ElasticSearch,这一切都很好。但是,我未能实现的是此表结构的逻辑映射,以及从映射中受益的查询。我似乎遇到问题的地方是名称实际上分为两列,这对我来说,返回一个健全的结果集的查询有点棘手。

如果有人可以给我一些帮助,以便我返回一个在顶部具有最接近(如果不是完全匹配)的结果集,并且随着我们通过结果集的进展,结果变得越来越不相似。

映射

我试图在这里为我的映射和查询获得一些灵感,并进行了一些更改,但是我似乎无法获得我需要/想要的结果 - http://goo.gl/hm9ISL

{
   "mappings":{
      "user":{
         "properties":{
            "pty_forename":{
               "type":"multi_field",
               "fields":{
                  "name":{
                     "type":"string",
                     "index":"analyzed"
                  },
                  "exact":{
                     "type":"string",
                     "index":"not_analyzed"
                  }
               }
            },
            "pty_surname":{
               "type":"multi_field",
               "fields":{
                  "name":{
                     "type":"string",
                     "index":"analyzed"
                  },
                  "exact":{
                     "type":"string",
                     "index":"not_analyzed"
                  }
               }
            },
            "pty_minute_ref":{
               "type":"integer",
               "index":"not_analyzed"
            },
            "pty_deed_code":{
               "type":"string",
               "index":"not_analyzed"
            },
            "pty_name_prefix":{
               "type":"string",
               "index":"not_analyzed"
            },
            "pty_name_suffix":{
               "type":"string",
               "index":"not_analyzed"
            },
            "pty_address":{
               "type":"string",
               "index":"not_analyzed"
            },
            "pty_desig_suffix":{
               "type":"string",
               "index":"not_analyzed"
            },
            "pty_mc_ind":{
               "type":"string",
               "index":"not_analyzed"
            },
            "pty_of_ind":{
               "type":"string",
               "index":"not_analyzed"
            },
            "pty_or_ind":{
               "type":"integer",
               "index":"not_analyzed"
            },
            "pty_date_entered":{
               "type":"basic_date",
               "index":"not_analyzed"
            },
            "pty_data":{
               "type":"string",
               "index":"not_analyzed"
            },
            "pty_type":{
               "type":"string",
               "index":"not_analyzed"
            }
         }
      }
   }
}

询问

{
   "query":{
      "bool":{
         "must":[
            {
               "multi_match":{
                  "query":"Nathan Smith",
                  "fields":[
                     "pty_forename",
                     "pty_surname"
                  ]
               }
            }
         ],
         "should":[
            {
               "term":{
                  "pty_forename.exact":{
                     "value":"Nathan Smith",
                     "boost":15
                  }
               }
            },
            {
               "prefix":{
                  "pty_forename.exact":{
                     "value":"Nathan Smith",
                     "boost":10
                  }
               }
            },
            {
               "match_phrase":{
                  "pty_forename":{
                     "query":"Nathan Smith",
                     "slop":0,
                     "boost":5
                  }
               }
            }
         ]
      }
   }
}

结论

我返回的结果集没有查询两个字段,即 pty_forename 和 pty_surname,而是返回姓氏为 Nathan 等的人。任何帮助将不胜感激。

更新 - 链接到 Gist

链接到要点

4

2 回答 2

1

你正在寻找这样的东西吗?

"bool" : {
    "should" : {
        "match" : { "pty_forename" : "nathan" }
    },
    "should" : {
        "match" : { "pty_surname" : "smith" }
    }
}

也就是说,所有结果都带有pty_forename= "nathan" OR pty_surname= "smith"(两者的得分都更高)。

于 2013-08-13T19:20:17.640 回答
1
  1. 在您链接的 StackOverflow 示例和elasticsearch Multifield 文档中,在“访问字段”标题下,multi_field 类型中“字段”下列出的第一个字段应与字段本身具有相同的名称。因此,在 SO 和文档示例中,“name”是“fields”下给出的第一个名称,因为“name”是 multi_type 字段的名称。在您的示例中,您的映射应该是

        "pty_forename":{
           "type":"multi_field",
           "fields":{
              "pty_forename":{
                 "type":"string",
                 "index":"analyzed"
              },
              "exact":{
                 "type":"string",
                 "index":"not_analyzed"
              }
           }
        },
        "pty_surname":{
           "type":"multi_field",
           "fields":{
              "pty_surname":{
                 "type":"string",
                 "index":"analyzed"
              },
              "exact":{
                 "type":"string",
                 "index":"not_analyzed"
              }
           }
        },
    

    正如您现在的映射一样,您的“布尔”“必须”查询可能没有做任何事情,因为您的多字段“字段”当前都没有被命名为“pty_forename”或“pty_surname”。我说可能是因为我不知道 Elasticsearch 是否仍然在其名称下保存一个 multi_field,即使您不在“字段”部分使用该名称。

  2. 正如 femtoRgon 建议的那样,您的“布尔”“应该”查询需要同时搜索“pty_forename”和“pty_surname”,可能是这样的:

    
          "multi_match" : {
                "fields" : ["pty_forename.exact", "pty_surname.exact"],
                "value" : "Nathan Smith",
                "type" : "term"
          },
         "multi_match" : {
                "fields" : ["pty_forename.exact", "pty_surname.exact"],
                "value" : "Nathan Smith",
                "type" : "prefix"
          },
          "multi_match" : {
                "fields" : ["pty_forename.exact", "pty_surname.exact"],
                "query" : "Nathan Smith",
                "slop":0,
                "boost":5,
                "type" : "match_phrase"
          }
     

我在这里查看了 javanna 的答案Elasticsearch phrase prefix query on multiple fields

于 2013-08-13T19:47:24.173 回答