2015-07-15 3 views
0

У меня есть следующие базы данных в Clusterpoint:Поиск атрибутов

<db> 
    <document> 
    <id>1</id> 
    <name lang="en">John</name> 
    <name lang="ru">Джон</name> 
    </document> 
    <document> 
    <id>2</id> 
    <name lang="en">Bill</name> 
    <name lang="ru">Билл</name> 
    </document> 
</db> 

я готов выполнить запрос на поиск определенного имени. Обычно я бы указал:

<query><name>Bill</name></query> 

Однако это может совпадать как с английским, так и с русским именем.

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

ответ

1

Можно определить атрибуты дочерних тегов в запросе и использовать их в поиске, агрегация, заказ и т.д.

Если вы хотите, чтобы искать < имя > с определенным значением атрибута, а затем просто указать это в запросе:

<query><name>Bill<lang>en</lang></name></query> 

Это будет поиск документов, в которых оба условия согласованы. Так что, если ваша база данных содержит, например, документы (я добавил документ с идентификатором = 3):

<db> 
    <document> 
    <id>1</id> 
    <name lang="en">John</name> 
    <name lang="ru">Джон</name> 
    </document> 
    <document> 
    <id>2</id> 
    <name lang="en">Bill</name> 
    <name lang="ru">Билл</name> 
    </document> 
    <document> 
    <id>3</id> 
    <name lang="it">Bill</name> 
    <name lang="ru">Билл</name> 
    </document> 
</db> 

затем запрос упоминалось выше (с определенными атрибутами) возвращает документ с идентификатором = 2.

Но если вы будете искать по:

<query><name>Bill</name></query> 

, то вы получите два документа с идентификатором = 2 и ид = 3.

Будьте осторожны, если есть повторяющиеся теги, необходимо использовать тег colocation путем определения правила «colocate = yes» в конфигурации политики для соответствующего тега (в вашем случае - < имя >) и с помощью «@ оператора в запросе.

При добавлении документа в базу данных:

<document> 
    <id>4</id> 
    <name lang="en">Steve</name> 
    <name lang="ru">John</name> 
</document> 

И будет пытаться вернуть документы, где оба условия значения совпадают внутри одного повторяющегося тега, то запрос:

<query><name>John<lang>en</lang></name></query> 

будет возвращать неверный результат - документы с id = 1 и id = 4.

Но, определяя "colocate = да" для < имени > и с помощью "@" оператора:

<query> @ <name>John<lang>en</lang></name> @ </query> 

вы получите правильный один - с идентификатором = 1.

+0

Это не работает. Добавьте еще один документ с Steve и John. Если вы сделаете поиск по John ru вы получите первый документ и тот, который я предложил, хотя lang для моего Джона является «ru». – Endijs

+0

@Endijs Вы правы, если в одном документе есть повторяющиеся теги, это не сработает, потому что этот запрос ищет совпадения во всех тегах документа отдельно, а не в «связанных» тегах. Для этого вы должны использовать функцию тегов colocation. Я просто добавил этот пример в ответ (спасибо за эту ссылку). – Marija

+0

Ах. Я также пробовал подход «@», и он не работал раньше. Теперь, после добавления соответствующего правила политики, он начал работать. :) – Endijs