我正在寻找一种使用Elastica同时搜索多个索引的方法。
我有一个索引products
和一个索引user
。
products
包含{product_id, product_name, price}
,而user
包含{product_id, user_name, date}
。知道两者中的product_id
是相同的,因此在products
中每个products_id
是唯一的,但是在user
中,他们并不是用户可以多次购买同一产品时间。
无论如何,我想在搜索products
索引时自动从user
索引中获取产品价格。
我知道我们可以像这样搜索多个索引(如果我输入错了,请纠正我):
$search = new \Elastica\Search($client);
$search->addIndex('users')
->addType('user')
->addIndex('products')
->addType('product');
但是问题是,例如当我在products_id
上写一个聚合,然后用一些过滤器创建一个新查询时:
$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
链接到另一个索引?
答案 0 :(得分:0)
基本上,您希望像sql一样基于一个公共字段连接两个索引。
您可以使用 join数据类型
在同一索引中对数据进行建模https://www.elastic.co/guide/en/elasticsearch/reference/master/parent-join.html
为同一索引中的所有文档建立索引,
并使用父子聚合和查询
注意:- 确保父子映射的性能含义 https://www.elastic.co/guide/en/elasticsearch/reference/master/parent-join.html#_parent_join_and_performance
您可以做的另一件事是将产品的所有信息都发送给购买该产品的每个用户。
但这会不必要地浪费您的空间,对于数据规则而言,这不是一个好习惯。
但是,由于这是一个搜索引擎,elasticsearch建议最好是规范化和复制数据,而不是使用父子数据。
答案 1 :(得分:0)
您可以尝试以下操作: 1-命名具有特定名称的索引,如下所示:
myFirstIndex-myProjectName
mySecIndex-myProjectName
myThirdIndex-myProjectName
以此类推。
2-这使我能够在索引字段中使用*进行搜索,因为它接受通配符,因此我可以使用kibana Dev Tools跨多个字段进行搜索
GET *-myProjectName/_search
{
"_source": {
"excludes": [ "*" ]
},
"query": { "match_all": {} },
}
这将搜索包含-myProjectName的每个索引。
答案 2 :(得分:0)
您无法查询具有不同映射的两个索引。解决问题的最佳方法是仅执行两个查询(应用程序侧连接)。第一个查询是对用户进行汇总,第二个查询是价格。
另一个选择是将价格添加到用户索引中。有时您必须牺牲一点空间以提高可用性。
答案 3 :(得分:0)
Elastica库支持Multi Search API,multi search API允许在同一API中执行多个搜索请求。它的终结点是_msearch
。
请求的格式类似于批量API,第一行 是标头部分,其中包含要搜索的一个或多个索引,第二行包括典型的搜索主体请求。
{"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中检查测试用例,以了解如何使用。