imbo/imbo-metadata-search

此包已被废弃,不再维护。未建议替代包。

Imbo的元数据搜索插件

2.1.0 2016-05-09 10:49 UTC

This package is not auto-updated.

Last update: 2023-04-13 08:37:24 UTC


README

Current build Status

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.deleteimages.postimage.postmetadata.postmetadata.putmetadata.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}}]}

会在键 namekristoffermorten,并且 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 BrabrandMorten Fangel

许可协议:MIT许可证