postgresql xpath整数索引

时间:2015-07-23 14:00:41

标签: xml postgresql xpath

我想知道是否有任何方法可以根据xpath结果的某种类型转换来创建索引。特别是一个整数索引,但我也可以想象日期,浮点等。即使它是实验性的或将来的postgres ...或其他数据库的未来版本。我已经看过eXistdb,它远远没有准备好生产。

一些测试XML:

<?xml version="1.0"?>
<book>
    <isbn>1</isbn>
    <title>Goldfinger</title>
    <author>Ian Fleming</author>
</book>

我能用这样的表和索引获得非常令人满意的结果。

                                             Table "public.test"
 Column |  Type   |                     Modifiers                     | Storage  | Stats target | Description
--------+---------+---------------------------------------------------+----------+--------------+-------------
 id     | integer | not null default nextval('test_id_seq'::regclass) | plain    |              |
 num    | integer |                                                   | plain    |              |
 data   | xml     |                                                   | extended |              |
Indexes:
    "test_pkey" PRIMARY KEY, btree (id)
    "test_title_index" btree (((xpath('/book/title/text()'::text, data))[1]::text))

用于查询,例如:

SELECT *
FROM test
WHERE (xpath('/book/title/text()', data))[1]::text = 'Goldfinger';

但是模式中有数据,非文本索引会更有意义。例如(我知道这是无效的,但它说明了这一点):

SELECT *
FROM test
WHERE (xpath('/book/isbn/text()', data))[1]::int BETWEEN 5 AND 10;

一点背景:

我正在尝试在postgres中存储XML文档,因为我有一个应用程序,其中主要数据类型已经是XML格式,并且通常需要像这样检索。模式可能非常复杂,因此将它们拆分为数据库列非常耗时,尤其是在模式发展时。我只提到这一点,因为我怀疑对我的问题的逻辑反应将是“将数据分解为原生列”。

1 个答案:

答案 0 :(得分:2)

您可以为自己想要的任何内容创建indexes on expressions。没有直接从xml转换为integer,但您可以通过text。数据库还抱怨语法创建索引,直到我用括号做了一点点。

最后,我让这个工作:

CREATE TABLE books (id integer, data xml)
CREATE INDEX books_isbn ON BOOKS (((((xpath('/book/isbn/text()', data))[1])::text)::integer));