【问题标题】:elastic serach find documents based on locationelasticsearch 根据位置查找文档
【发布时间】:2016-08-01 07:18:59
【问题描述】:

我正在使用弹性搜索 1.4 和 couchbase 3.2。我必须根据位置找到所有文件。例如,我必须找到用户的纬度和经度,并显示他附近与他的兴趣相匹配的所有事件。我将事件数据存储在 couchbase 上。

{
  "createdUnder": "11",
  "createdby": "4",
  "name": "Vcunnect April Event Testing",
  "location": "Madurai, Tamil Nadu, India",
  "address": {
      "venuename": "MKU University",
      "address1": "MKU University",
      "address2": "MKU University",
      "city": "Madurai",
      "state": "Tamil Nadu",
      "country": "India",
      "zipcode": "875485"
  },
  "description": "Vcunnect testing Event\r\n",
  "lat": "9.9252007",
  "lng": "78.11977539999998",
  "startdate": "08/10/2016",
  "enddate": "08/10/2016",
  "starttime": "5:20pm",
  "endtime": "7:00pm",
  "organisers": [
     {
         "organisername": "Raushan Kumar",
         "organiseremail": "raushankumar@gmail.in",
         "organiserdescription": "Event Organizer",
         "status": "active"
     }
  ],
  "starttimestamp": 1470867600,
  "endtimestamp": 1470873600
}

我的文档中有两个字段,分别是“lat”和“lng”。使用这个和用户位置的纬度和经度,我想找到用户附近的事件。我正在使用此查询来获取文档。

    $searchParams['index'] = 'events';
    $searchParams['type'] = 'couchbaseDocument';
    $searchParams['from'] = 0;
    $searchParams['size'] = 1000;
    $searchParams['body']['query']['filtered']['filter']['bool']['must'][]['term']['displaystatus'] = 0;
    $searchParams['body']['query']['filtered']['filter']['bool']['must'][]['term']['eventstatus'] = "active";
    $searchParams['body']['query']['filtered']['filter']['bool']['must'][]['range']['starttimestamp']['from'] = $today;
    $searchParams['body']['query']['filtered']['filter']['bool']['must'][]['term']['displayoutside'] = 1;
    $searchParams['body']['query']['filtered']['filter']['bool']['must'][]['terms']['cat_id'] = $interestIdArray;
    $result = $client->search($searchParams);

我在json文件中的映射是as

{
"template" : "*",
"order" : 10,
"mappings" : {
    "couchbaseCheckpoint" : {
        "_source" : {
            "includes" : ["doc.*"]
        },
        "dynamic_templates": [
            {
                "store_no_index": {
                    "match": "*",
                    "mapping": {
                        "store" : "no",
                        "index" : "no",
                        "include_in_all" : false
                    }
                }
            }
        ]
    },
    "_default_" : {
        "_source" : {
            "includes" : ["meta.*"]
        },
        "properties" : {
            "meta" : {
                "type" : "object",
                "include_in_all" : false
            }
        }
    }
}
}

我的弹性搜索集群中有五个索引,名为“事件、组、聊天消息、赞助商和用户数据”。从他们那里,我想仅针对事件和组索引进行基于位置的映射。我必须改变什么..?

【问题讨论】:

  • 嘿@val,你有什么建议
  • 你的 ES 映射是什么样子的?
  • 在我的映射中显示为 "mappings":{ "couchbaseDocument":{ "doc":{ "lan":{ "type":"string" }, "lat":{ "类型":"字符串" } } } }
  • 嘿@Val,我研究发现这是elasticsearch couchbase_template.json 的默认映射。能否提供一个索引映射结构示例

标签: php elasticsearch couchbase


【解决方案1】:

注意:这个答案是 ES 1.x 特有的,语法在 2.x 中会有些不同

如果您想以可在 Elasticsearch 中查询的方式存储坐标,您必须执行以下操作:

  1. 以 ES 能够映射到 geo_point 的格式存储纬度/经度,这意味着作为对象{ 'location': {'lat': 123, 'lon': 123}} 的子属性或作为数组[<lon>, <lat>](注意此处的顺序)。
  2. 手动更新 ES 映射以将您的位置字段视为 geo_point 类型。看看这里的例子:https://www.elastic.co/guide/en/elasticsearch/reference/1.4/mapping-geo-point-type.html
  3. 使用地理过滤器之一按距离/范围/边界形状进行查询,例如地理距离过滤器:https://www.elastic.co/guide/en/elasticsearch/reference/1.4/query-dsl-geo-distance-filter.html

例子:

将位置索引为 geo_point 类型的文档映射片段:

{
    "data" : {
        "properties" : {
            "location" : {
                "type" : "geo_point"
            }
        }
    }
}

带有位置的文档:

{
    "data" : {
        "location" : {
            "lat" : 9.9252007,
            "lon" : 78.11977539999998
        }
    }
}

查询以查找位置在某个点 10 公里半径内的文档(应至少返回前面的示例文档):

{
    "filtered" : {
        "query" : {
            "match_all" : {}
        },
        "filter" : {
            "geo_distance" : {
                "distance" : "10km",
                "data.location" : {
                    "lat" : 9.9,
                    "lon" : 78.12
                }
            }
        }
    }
}

【讨论】:

  • 在这里我可以手动更新 ES 映射。这是一个现有项目,我对如何创建映射以及如何更新它一无所知。你能解释一下这个过程吗?
  • 嘿@David 我正在使用 elasticsearch-couchbase-transport-2.1.1 将 Couchbase 服务器与 Elasticsearch 结合使用
  • 你可能想看看这个博客,它解释了如何更新现有索引上的映射:elastic.co/blog/changing-mapping-with-zero-downtime
  • 或者,您应该更新 Couchbase-ES 插件附带的模板(它是位于插件安装目录中的 json 文件)以包含您的自定义映射,更新(HTTP PUT)ES 中的模板然后创建一个新索引,该索引将使用模板中更新的映射。有关模板的更多信息,请转到此处:elastic.co/guide/en/elasticsearch/reference/1.3/…
  • 谢谢@David Ostrovsky,我编辑了我的问题并添加了我的映射,我只需要更改两个索引的映射,我必须在那里修改,其他所有字段可能保持不变
猜你喜欢
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 2022-01-13
  • 1970-01-01
  • 2015-01-14
  • 2016-08-29
相关资源
最近更新 更多