imbo / imbo-metadata-search
Imbo的元数据搜索插件
Requires
- php: >=5.5.0
Requires (Dev)
- ext-imagick: >=3.0.1
- beberlei/assert: ~2.4
- behat/behat: ~3.0
- elasticsearch/elasticsearch: ~2.1
- guzzle/plugin-history: ~3.9
- imbo/imbo: ^2.1
- imbo/imbo-phpcs-standard: dev-master
- imbo/imboclient: ~2.0
- phpunit/phpunit: ~4.8
- squizlabs/php_codesniffer: ~2.5
Suggests
- elasticsearch/elasticsearch: Enables usage of elasticsearch as search backend. Recommended version: >=2.1.0
This package is not auto-updated.
Last update: 2023-04-13 08:37:24 UTC
README
Imbo的元数据搜索插件
元数据搜索事件监听器会挂载到您的图像的元数据更新事件上,并使您选择的搜索后端保持最新状态,同时允许您通过查询其元数据来查找图像。
安装
设置依赖项
如果您通过composer安装了Imbo,则启动元数据搜索非常简单。只需将imbo/imbo-metadata-search
作为依赖项添加。
除了元数据搜索插件之外,您还需要一个搜索后端客户端。目前插件仅支持Elasticsearch,因此您还需要添加elasticsearch/elasticsearch
以将其用作搜索后端。
{ "require": { "imbo/imbo-metadata-search": "dev-master", "elasticsearch/elasticsearch": "~2.1" } }
Elasticsearch插件要求您的Elasticsearch服务器至少为版本2.0。
元数据搜索设置
为了让元数据搜索插件注册并真正为您的Imbo安装提供有用的功能,您需要添加一个配置文件,该文件声明了路由、资源和事件监听器。
使用composer安装后,您可以在vendor/imbo/imbo-metadata-search/config.dist.php
中找到元数据搜索的基本配置文件。如果您想修改文件,应将其复制到您的配置文件夹中。
索引
以下事件之一触发时,将触发搜索后端的更新:image.delete
、images.post
、image.post
、metadata.post
、metadata.put
、metadata.delete
。
image.delete
事件会在搜索后端的索引对象中触发删除,其他事件会触发整个对象的更新。在索引过程中,除了元数据之外,还会向搜索后端提供数据以进行索引,以便排序等。
提供给后端的数据包括:
数据 | 描述 |
---|---|
用户 |
拥有图像的用户 |
大小 |
图像的字节数 |
扩展名 |
文件扩展名 |
MIME类型 |
文件的MIME类型 |
元数据 |
图像元数据 |
添加 |
图像添加的时间戳表示 |
更新 |
图像最后更新的时间戳表示 |
宽度 |
图像的像素宽度 |
高度 |
图像的像素高度 |
查询
查询是通过向/users/<user>/images
发出HTTP搜索请求来完成的,如果您想搜索单个用户的图像,或者想跨多个用户搜索,则支持的查询参数为:
参数 | 描述 |
---|---|
页码 |
页码。默认为1。 |
限制 |
每页图像数量。默认为20。 |
元数据 |
是否在输出中包含元数据。默认为0,设置为1以启用。 |
fields[] |
一个包含要显示的字段的数组。如果没有指定,将显示所有字段。 |
sort[] |
一个包含按其排序的字段的数组。排序方向通过在字段后附加asc或desc来指定,由冒号分隔。如果没有指定方向,则使用asc。例如:?sort[]=size&sort[]=width:desc 与 ?sort[]=size:asc&sort[]=width:desc 相同。如果没有指定排序,则搜索后端将按相关性排序。 |
查询通过请求体发送。
示例
查询一个用户
$ curl 'http://imbo/users/<user>/images?limit=1&metadata=1' -d '{"foo": "bar"}'
查询多个用户
$ curl 'http://imbo/images?users[]=<user1>&users[]=<user2>&limit=1&metadata=1' -d '{"foo": "bar"}'
这两个请求的结果看起来像这样
{ "search": { "hits": 3, "page": 1, "limit": 1, "count": 1 }, "images": [ { "added": "Mon, 10 Dec 2012 11:57:51 GMT", "updated": "Mon, 10 Dec 2012 11:57:51 GMT", "checksum": "<checksum>", "originalChecksum": "<originalChecksum>", "extension": "png", "size": 6791, "width": 1306, "height": 77, "mime": "image/png", "imageIdentifier": "<image>", "user": "<user>", "metadata": { "key": "value", "foo": "bar" } } ] }
Imbo DSL
Imbo元数据搜索使用的查询语言是MongoDB查询DSL的一个子集。查询是一个JSON编码的对象,包括key => value
匹配以及支持的运算符的组合,通过请求体发送给Imbo。本节列出了所有运算符,并包含一些示例,展示了如何使用元数据查询查找图像。
注意:不同查询的结果可能会根据您用于元数据的后端而略有不同。
键/值匹配
元数据查询的最简单形式是简单的key => value
匹配,如果查询中有多个键/值匹配,则表达式会被AND连接起来。
{"key":"value","otherkey":"othervalue"}
上述搜索将返回具有元数据键key
设置为value
的图像,并且otherkey
设置为othervalue
。
大于 - $gt
此运算符可用于检查是否大于指定的值。
{"age":{"$gt":35}}
大于等于 - $gte
检查是否大于等于指定的值。
{"age":{"$gte":35}}
小于 - $lte
检查是否小于指定的值。
{"age":{"$lt":35}}
小于等于 - $lte
检查是否小于等于指定的值。
{"age":{"$lte":35}}
不等于 - $ne
匹配不等于指定值的值。
{"name":{"$ne":"christer"}}
在 - $in
查找出现在指定集合中的值。
{"styles":{"$in":["IPA","Imperial Stout","Lambic"]}}
不在 - $nin
查找不在指定集合中出现的值。
{"styles":{"$nin":["Pilsner"]}}
字段存在 - $exists
确保给定的字段是否存在或不存在。
{"age":{"$exists":true}}
合取 - $and
此运算符可用于组合必须全部匹配的多个标准。它接受查询数组。
{"$and": [{"name": {"$in": ["kristoffer", "morten"]}}, {"age": {"$lt": 30}}]}
会在键 name
为 kristoffer
或 morten
,并且 age
键小于 30
的图像中查找。
析取 - $or
此运算符可用于组合一系列条件,其中至少有一个必须匹配。它接收一个查询数组。
{"$or":[{"key":"value"},{"otherkey":"othervalue"}]}
将检索具有键名为 key
且值为 value
的键,以及/或者具有键名为 otherkey
且值为 othervalue
的键的图像。
在一次查询中使用多个运算符
所有上述运算符都可以组合成一个查询。考虑一个包含所有啤酒图像的集合,这些啤酒都贴上了啤酒厂、啤酒名称、啤酒风格和酒精度。如果我们想找到所有特定风格的啤酒图像、高于特定酒精度、来自两个不同啤酒厂,以及所有来自Nøgne Ø的啤酒图像(无论风格和酒精度如何),但不是名为Wit的啤酒(无论来自哪个啤酒厂、风格或酒精度),查询可能如下所示(格式化以便于阅读)
{ "name": { "$ne": "Wit" }, "$or": [ { "brewery": "Nøgne Ø" }, { "$and": [ { "abv": { "$gte": 5.5 } }, { "style": { "$in": [ "IPA", "Imperial Stout" ] } }, { "brewery": { "$in": [ "HaandBryggeriet", "Ægir" ] } } ] } ] }
请注意,针对大型图像集合的大复杂查询可能需要一些时间才能完成,并且可能会在Imbo服务器上引起性能问题。
许可证
版权所有(c)2015,Kristoffer Brabrand 和 Morten Fangel
许可协议:MIT许可证