Создание нового индекса для поисковых целей из трех других индексов с упругим поиском Java API - PullRequest
0 голосов
/ 04 сентября 2018

У нас есть требование для поиска данных по нескольким индексам. Мы попытались объединить их в единое целое с помощью поисковой системы hibernate, все прошло хорошо, но этот сводный индекс не обновляется после обновления фактической таблицы базы данных. Хотя отдельные индексы успешно обновляются. Таким образом, мы должны изменить нашу стратегию с hibernate orm на упругий поиск java api.

Чтобы достичь этого, я подумал, смогу ли я получить какую-либо логику для объединения трех разных индексов в один, прежде чем запускать поисковый запрос. Чтобы я мог получить данные из всех трех индексов. Эти индексы имеют общее поле, которое можно рассматривать как поле идентификатора. Могу ли я связать их в этом поле идентификатора и получить реляционные данные из этих индексов, после объединения их в один.

Ниже приведено определение индекса для трех индексов, которые я хочу объединить.

basclt0100:

   {
  "basclt0100" : {
    "aliases" : { },
    "mappings" : {
      "com.csc.pt.svc.data.to.Basclt0100TO" : {
        "dynamic" : "strict",
        "properties" : {
          "clientname" : {
            "type" : "text",
            "store" : true,
            "analyzer" : "nameAnalyzer"
          },
          "cltseqnum" : {
            "type" : "long",
            "store" : true
          },
          "firstname" : {
            "type" : "text",
            "store" : true,
            "analyzer" : "nameAnalyzer"
          },
          "id" : {
            "type" : "keyword",
            "store" : true
          },
          "longname" : {
            "type" : "text",
            "store" : true,
            "analyzer" : "nameAnalyzer"
          },
          "midname" : {
            "type" : "text",
            "store" : true
          }
        }
      }
    },
    "settings" : {
      "index" : {
        "number_of_shards" : "5",
        "provided_name" : "basclt0100",
        "creation_date" : "1536086417001",
        "analysis" : {
          "analyzer" : {
            "nameAnalyzer" : {
              "filter" : [
                "lowercase"
              ],
              "tokenizer" : "keyword"
            }
          }
        },
        "number_of_replicas" : "1",
        "uuid" : "YKCtVIaCQjatBeb2g1JfUA",
        "version" : {
          "created" : "6030299"
        }
      }
    }
  }
}

basclt0300

    {
  "basclt0300" : {
    "aliases" : { },
    "mappings" : {
      "com.csc.pt.svc.data.to.Basclt0300TO" : {
        "dynamic" : "strict",
        "properties" : {
          "addrln1" : {
            "type" : "text",
            "store" : true,
            "analyzer" : "addressAnalyzer"
          },
          "addrln2" : {
            "type" : "text",
            "store" : true,
            "analyzer" : "addressAnalyzer"
          },
          "addrln3" : {
            "type" : "text",
            "store" : true
          },
          "addrseqnum" : {
            "type" : "text",
            "store" : true
          },
          "city" : {
            "type" : "text",
            "store" : true,
            "analyzer" : "addressAnalyzer"
          },
          "cltseqnum" : {
            "type" : "long",
            "store" : true
          },
          "country" : {
            "type" : "text",
            "store" : true,
            "analyzer" : "addressAnalyzer"
          },
          "id" : {
            "type" : "keyword",
            "store" : true
          },
          "state" : {
            "type" : "text",
            "store" : true
          },
          "zipcode" : {
            "type" : "text",
            "store" : true,
            "analyzer" : "addressAnalyzer"
          }
        }
      }
    },
    "settings" : {
      "index" : {
        "number_of_shards" : "5",
        "provided_name" : "basclt0300",
        "creation_date" : "1536086426461",
        "analysis" : {
          "analyzer" : {
            "addressAnalyzer" : {
              "filter" : [
                "standard",
                "lowercase",
                "asciifolding"
              ],
              "tokenizer" : "standard"
            }
          }
        },
        "number_of_replicas" : "1",
        "uuid" : "irxvUu2qR3udpgJUE0NoSA",
        "version" : {
          "created" : "6030299"
        }
      }
    }
  }
}

basclt0900

{
  "basclt0900" : {
    "aliases" : { },
    "mappings" : {
      "com.csc.pt.svc.data.to.Basclt0900TO" : {
        "dynamic" : "strict",
        "properties" : {
          "cltseqnum" : {
            "type" : "long",
            "store" : true
          },
          "email1" : {
            "type" : "text",
            "store" : true,
            "analyzer" : "emailAnalyzer"
          },
          "email2" : {
            "type" : "text",
            "store" : true,
            "analyzer" : "emailAnalyzer"
          },
          "id" : {
            "type" : "keyword",
            "store" : true
          }
        }
      }
    },
    "settings" : {
      "index" : {
        "number_of_shards" : "5",
        "provided_name" : "basclt0900",
        "creation_date" : "1536086423657",
        "analysis" : {
          "analyzer" : {
            "emailAnalyzer" : {
              "filter" : [
                "lowercase"
              ],
              "tokenizer" : "classic"
            }
          }
        },
        "number_of_replicas" : "1",
        "uuid" : "dmzw9ZswTwCNVvne-FAt2w",
        "version" : {
          "created" : "6030299"
        }
      }
    }
  }
}

, пожалуйста, помогите с какой-нибудь йогой / стратегией для достижения этой цели.

Еще раз мы хотели бы выполнить поиск по всем полям этих трех индексов и извлечь соответствующие данные для поиска. Первичным ключом будет cltseqnum, доступный по всем трем индексам.

Ответы [ 2 ]

0 голосов
/ 13 июня 2019

Достигается это с помощью аннотаций @IndexedEmbedded и @ContainedIn и создания отношений OneToMany в наших .hbm файлах.

Кроме того, наша база данных не настолько реляционная, иначе это было бы несложно после использования этих аннотаций. Мне пришлось сделать обходной путь, чтобы заставить логику вставки работать для объединенного индекса (единый индекс из трех разных таблиц.). Хотя у этой логики есть некоторые ограничения / проблемы с частью вставки, надеясь, что команда HibernateSearch наверняка закроет эти аннотации более кратко в следующих выпусках.

0 голосов
/ 05 сентября 2018

Что вам нужно, это псевдоним индекса , если вы хотите запросить 3 индекса одновременно

Если вы рассматриваете Elasticsearch как реляционные базы данных, тогда да, попытка денормализации верна, так как эластичный поиск не является RDBMS. Таким образом, вы можете индексировать и обновлять / вставлять документы с помощью logstash , чтобы вы собрали все объединенные данные в один индекс

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...