Elasticsearch多字段查询

时间:2016-04-25 11:52:11

标签: elasticsearch

我在ElasticSearch中构建地址搜索查询时遇到了问题。

地址存储在ES中,结构如下:
地址 { 街, 市, 邮政编码 }

这是一个示例查询:

GET /adr-address/_search
{   
  "query": {
    "multi_match": {
      "query":       "mainstreet, houston",
      "type":        "most_fields",
      "fields":      [ "street", "city", "zipcode"]
    }
  }
}

"hits": [
 {
      "_source": {
       "id": "S6v4xyO8UE5NRcWtmMATPQ==",
       "street": "Houston 2nd Avenue",
       "zipcode": "8032",
       "city": "Houston"
    }
 },
 {
    "_source": {
       "id": "aLgQFrO8zCT8m88lAnYZPQ==",
       "street": "Houston 1st Avenue",
       "zipcode": "8044",
       "city": "Houston"
    }
 },
 {
    "_source": {
       "id": "aLgQFrO8zCT8m88lAnYZPQ==",
       "street": "mainstreet",
       "zipcode": "8044",
       "city": "Houston"
    }
 },

多重匹配查询在大多数情况下都能正常工作,但街道包含城市名称的情况除外。 Elasticsearch为这些结果分配了更高的优先级,这是完全可以理解的,即使不可接受。

这是_analyze结果:

GET /adr-address/_validate/query?explain
{
  "query": {
    "multi_match": {
      "query":       "mainstreet, houston",
      "type":        "most_fields",
      "fields":      [ "street", "city", "zipcode" ]
    }
  }
}

{
   "valid": true,
   "_shards": {
      "total": 1,
      "successful": 1,
      "failed": 0
   },
   "explanations": [
      {
         "index": "adr-address",
         "valid": true,
         "explanation": "(zipcode:mainstreet zipcode:houston) (street:mainstreet street:houston) (city:mainstreet city:houston)"
      }
   ]
}

应该注意的是,谷歌地图api会返回同一查询的准确结果。

到目前为止所做的假设/条件:

  1. 标记符包括:空格,逗号,数字等
  2. 输入字词可以包含任意顺序的多字街道名称,邮政编码或城市
  3. 有关如何改进搜索重播的任何建议吗?

1 个答案:

答案 0 :(得分:0)

尝试使用cross_fields而不是most_fields作为multi_match的类型。

来自文档:

  

cross_fields类型对结构化文档特别有用   多个字段应匹配的位置。例如,查询时   “Will Smith”的first_name和last_name字段,最佳匹配是   可能在一个领域有“意志”,在另一个领域有“史密斯”。

您使用的大多数字段似乎是用于搜索相同的文本,但以不同的方式进行分析。

示例查询:

GET /adr-address/_search
{   
  "query": {
    "multi_match": {
      "query":       "mainstreet, houston",
      "type":        "cross_fields",
      "fields":      [ "street", "city", "zipcode"]
    }
  }
}

link to docs