Arhn - архитектура программирования

эластичный поиск документов по местоположению

Я использую эластичный поиск 1.4 с кушеткой 3.2. Я должен найти все документы по местонахождению. Например, я должен найти широту и долготу пользователя и отобразить все события рядом с ним, для которых совпадают его интересы. Я храню данные о событиях на диване как.

{
  "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": "[email protected]",
         "organiserdescription": "Event Organizer",
         "status": "active"
     }
  ],
  "starttimestamp": 1470867600,
  "endtimestamp": 1470873600
}

В моем документе есть два поля: «широта» и «долгота». используя это и широту и долготу местоположения пользователя, я хочу найти события рядом с пользователем. Я использую этот запрос для получения документов.

    $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 выглядит так

{
"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
            }
        }
    }
}
}

У меня есть пять индексов в моем кластере elasticsearch с именами «события, группы, сообщения чата, спонсоры и пользовательские данные». Из них я хочу отображать на основе местоположения только индексы событий и групп. Что я должен изменить..?


  • привет @val, любое предложение с твоей стороны 01.08.2016
  • Как выглядит ваше картирование ES? 01.08.2016
  • в моем отображении это отображается как сопоставления: { диванбазаДокумент: { документ: { lan: { тип: строка }, лат: { тип: строка } } } } 01.08.2016
  • эй @Val, я провел исследование и обнаружил, что это сопоставление по умолчанию для elasticsearch Couchbase_template.json. Не могли бы вы предоставить мне образец структуры сопоставления для индекса 02.08.2016

Ответы:


1

Примечание: этот ответ относится к ES 1.x, синтаксис будет несколько отличаться в 2.x

Если вы хотите хранить координаты так, чтобы их можно было запрашивать в Elasticsearch, вам необходимо сделать следующее:

  1. Сохраните широту/долготу в формате, который ES сможет сопоставить с гео_точкой, что означает либо как подсвойства объекта { '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. Используйте один из геофильтров для запроса по расстоянию/диапазону/граничной форме, например. фильтр geo_distance: 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
                }
            }
        }
    }
}
01.08.2016
  • где я могу вручную обновить сопоставление ES. Это существующий проект, и я понятия не имею, как создается сопоставление и как я могу его обновить. Вы объясните мне процесс. 01.08.2016
  • привет @David, я использую elasticsearch-couchbase-transport-2.1.1 для использования Couchbase Server с Elasticsearch 01.08.2016
  • Возможно, вы захотите взглянуть на этот блог, в нем объясняется, как обновлять сопоставления существующих индексов: elastic.co/blog/change-mapping-with-zero-downtime 02.08.2016
  • В качестве альтернативы вам следует обновить шаблон, который поставляется с плагином Couchbase-ES (это файл json, расположенный в каталоге установки плагина), чтобы включить ваши пользовательские сопоставления, обновить (HTTP PUT) шаблон в ES, а затем создать новый индекс, который затем будет использовать обновленные сопоставления из шаблона. Перейдите сюда для получения дополнительной информации о шаблонах: elastic.co/ руководство/en/elasticsearch/reference/1.3/ 02.08.2016
  • спасибо @ Дэвид Островский, я отредактировал свой вопрос и добавил свои сопоставления, мне нужно изменить сопоставление только для двух индексов, что я должен там изменить, остальные все поля могут остаться прежними 02.08.2016
  • Я исследовал и обнаружил, что это сопоставление по умолчанию для elasticsearch coachbase_template.json. Не могли бы вы предоставить мне образец структуры сопоставления для индекса 02.08.2016
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..