我正在寻找一种方法来搜索多个索引在同一时间使用Elastica。
我有一个索引products和一个索引user。
products包含{product_id, product_name, price},user包含{product_id, user_name, date}。由于知道两者的product_id是相同的,所以在products中每个products_id都是唯一的,但在user中则不同,因为用户可以多次购买相同的产品。
无论如何,我想在搜索user索引时自动从products索引中获取产品的价格。
我知道我们可以像这样搜索多个索引(如果我错了,请纠正我):
$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链接到其他索引?
发布于 2018-10-10 22:53:54
基本上,您希望基于一个公共字段连接两个索引,就像在sql中一样。
您可以做的是使用连接数据类型对同一索引中的数据进行建模
对同一索引中的所有文档进行索引,
和使用父子聚合和查询
注意:确保父-子映射 https://www.elastic.co/guide/en/elasticsearch/reference/master/parent-join.html#_parent_join_and_performance的性能含义
你可以做的另一件事是把产品的所有信息放在每个购买它的用户那里。
但这可能会不必要地浪费您的空间,并且对于数据规则而言,这不是一个好的实践。
但由于这是一个搜索引擎,而elasticsearch建议最好是标准化和复制数据,而不是使用父子。
发布于 2018-10-22 11:07:12
Elastica库支持多搜索API,multi search API允许在同一个API中执行多个搜索请求。它的端点是_msearch。
请求的格式类似于bulk 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中的测试用例以了解如何使用。
发布于 2018-10-16 23:52:15
您可以尝试以下操作: 1-使用特定名称命名索引,如下所示
myFirstIndex-myProjectName
mySecIndex-myProjectName
myThirdIndex-myProjectName诸若此类。
2-这给了我在索引字段中使用*进行搜索的能力,因为它接受通配符,所以我可以使用kibana开发工具跨多个字段进行搜索
GET *-myProjectName/_search
{
"_source": {
"excludes": [ "*" ]
},
"query": { "match_all": {} },
}这将在包括-myProjectName的每个索引上进行搜索。
https://stackoverflow.com/questions/52742044
复制相似问题