PostgreSql XML текстовый поиск - PullRequest
2 голосов
/ 16 марта 2010

У меня есть текстовый столбец в таблице. Мы храним XML в этом столбце. Теперь я хочу искать теги и значения

Пример данных:

<bank>
  <name>Citi Bank</name>
  .....
  .....
/<bank>

Я бы хотел выполнить следующий запрос:

выберите * из xxxx, где to_tsvector ('english', xml_column) @@ to_tsquery ('<name>Citi Bank</name>')

Это работает нормально, но также работает для тегов, таких как name1 или без тегов.

Как мне настроить поиск, чтобы он работал, чтобы я получил точное совпадение для тега и значения?

Ответы [ 2 ]

2 голосов
/ 16 марта 2010

Вы можете использовать функцию xpath следующим образом

select *
from xxx
where xpath(xml_column, 'bank/name/text()') = 'CitiBank';

НО он не будет использовать индекс полнотекстового поиска. Вы можете использовать подзапрос, чтобы найти возможные совпадения и избежать полного сканирования, а также выражение xpath для получения правильных ответов, или создать индекс функции, если запросы будут всегда одинаковыми.

1 голос
/ 17 марта 2010

Возможно, вы захотите пересмотреть хранение XML в базе данных, вместо этого вы можете посмотреть на вставку данных в связанные таблицы, так как использование XML является плохой заменой для реляционного хранилища. Даже если вы используете XML в базе данных, используйте тип XML, а не тип TEXT, и создайте такой индекс (да, в принципе вам потребуется индекс для выражения xpath):

CREATE INDEX my_funcidx ON my_table USING GIN ( CAST(xpath('/bank/name/text()', xmlfield) AS TEXT[]) );

затем запросите это так:

SELECT * FROM my_table WHERE CAST(xpath('/bank/name/text()', xmlfield) AS TEXT[]) @> '{Citi Bank}'::TEXT[];

и это будет использовать индекс, как покажет EXPLAIN.

Важной частью является CASTing to TEXT [], так как XML [], который возвращает функция xpath, по умолчанию не индексируется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...