首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >elastica中的多个索引搜索

elastica中的多个索引搜索
EN

Stack Overflow用户
提问于 2018-10-10 22:02:05
回答 4查看 1.4K关注 0票数 4

我正在寻找一种方法来搜索多个索引在同一时间使用Elastica。

我有一个索引products和一个索引user

products包含{product_id, product_name, price}user包含{product_id, user_name, date}。由于知道两者的product_id是相同的,所以在products中每个products_id都是唯一的,但在user中则不同,因为用户可以多次购买相同的产品。

无论如何,我想在搜索user索引时自动从products索引中获取产品的价格。

我知道我们可以像这样搜索多个索引(如果我错了,请纠正我):

代码语言:javascript
复制
$search = new \Elastica\Search($client);
$search->addIndex('users')
        ->addType('user')
        ->addIndex('products')
        ->addType('product');

但问题是,例如,当我在products_id上编写聚合,然后使用一些过滤器创建一个新查询时:

代码语言:javascript
复制
$products_agg = new \Elastica\Aggregation\Terms('products_id');
$products_agg->setField('products_id')->setSize(0);

$query = new \Elastica\Query();
$query->addAggregation($products_agg);
$query->setQuery($bool);

$search->setQuery($query);

elastica如何知道要在哪个索引中进行搜索?如何将此products_id链接到其他索引?

EN

回答 4

Stack Overflow用户

发布于 2018-10-10 22:53:54

基本上,您希望基于一个公共字段连接两个索引,就像在sql中一样。

您可以做的是使用连接数据类型对同一索引中的数据进行建模

对同一索引中的所有文档进行索引,

  • 将所有产品文档设为父级。
  • 将所有用户文档设为子

和使用父子聚合和查询

https://www.elastic.co/guide/en/elasticsearch/reference/master/parent-join.html#_parent_join_queries_and_aggregations

注意:确保父-子映射 https://www.elastic.co/guide/en/elasticsearch/reference/master/parent-join.html#_parent_join_and_performance的性能含义

你可以做的另一件事是把产品的所有信息放在每个购买它的用户那里。

但这可能会不必要地浪费您的空间,并且对于数据规则而言,这不是一个好的实践。

但由于这是一个搜索引擎,而elasticsearch建议最好是标准化和复制数据,而不是使用父子。

票数 1
EN

Stack Overflow用户

发布于 2018-10-22 11:07:12

Elastica库支持多搜索API,multi search API允许在同一个API中执行多个搜索请求。它的端点是_msearch

请求的格式类似于bulk API,第一行是头部分,包括要搜索的索引,第二行包括典型的搜索体请求。

代码语言:javascript
复制
{"index" : "products", "type": "products"}
{"query" : {"match_all" : {}}, "from" : 0, "size" : 10} // write your own query to get price
{"index" : "uesrs", "type" : "user"}
{"query" : {"match_all" : {}}} // query for user

查看Multi/SearchTest.php中的测试用例以了解如何使用。

票数 1
EN

Stack Overflow用户

发布于 2018-10-16 23:52:15

您可以尝试以下操作: 1-使用特定名称命名索引,如下所示

代码语言:javascript
复制
myFirstIndex-myProjectName
mySecIndex-myProjectName
myThirdIndex-myProjectName

诸若此类。

2-这给了我在索引字段中使用*进行搜索的能力,因为它接受通配符,所以我可以使用kibana开发工具跨多个字段进行搜索

代码语言:javascript
复制
GET *-myProjectName/_search
{
  "_source": {
    "excludes": [ "*" ]
  },
  "query": { "match_all": {} },
}

这将在包括-myProjectName的每个索引上进行搜索。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52742044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档