Транзакционные запросы Alfresco 5.0

У меня есть несколько вопросов о том, как индекс в Alfresco One работает с транзакционными запросами.

  1. Мы используем Alfresco 5.0.2, и в документации я могу прочитать следующее: «При обновлении базы данных вы можете добавить необязательные индексы для поддержки функции запроса метаданных».

Предположим, что в моем model.xml я добавляю пользовательское свойство, подобное этому:

 <type name="doc:myDoc">
 <title>Document</title>
 <parent>cm:content</parent>
 <properties>
   <property name="doc:level">     
     <title>Level</title>                                                                    
     <type>d:text</type>
     <mandatory>true</mandatory>
     <index enabled="true">
        <atomic>true</atomic>
        <stored>false</stored>
        <tokenised>both</tokenised>
     </index>
   </property>
   ...    
  </properties>
</type>                

И у меня есть на моем alfresco-global.properties эти наборы

solr.query.cmis.queryConsistency=TRANSACTIONAL_IF_POSSIBLE
solr.query.fts.queryConsistency=TRANSACTIONAL_IF_POSSIBLE
system.metadata-query-indexes.ignored=false  

Мой первый вопрос: как Alfresco узнает, какие свойства я хочу проиндексировать в БД? Прочитать мой model.xml и проиндексировать только те проиндексированные свойства, которые я там указываю? Индексировать все пользовательские свойства? Или мне нужно создать скрипт для добавления этих новых индексов?

Я прочитал скрипт metadata-query-indexes.sql, но не понимаю, как его переписать, чтобы добавить новый индекс для моего свойства. Если нужен этот скрипт, не могли бы вы привести пример со свойством doc:myDoc, которое я написал ранее, пожалуйста?

  1. Другой вопрос касается синтаксиса запроса, который не поддерживается БД и идет напрямую в SOLR.

Я читал, что PATH, SITE, ANCESTOR, OR, любые свойства d:content, d:boolean или d:any (среди прочего) в вашем запросе, иначе он не будет выполняться для БД. Но я не понимаю, что такое d:content.

Например, запрос (на основе моего пользовательского свойства, написанного ранее) типа TYPE:whatever AND @doc\:level:"value" считается d:content? Этот запрос поддерживается BD или идет в SOLR?

  1. Я читал также это:

«Любые проверки свойств должны быть выражены в форме, которая означает «проверка идентичного значения», поскольку запрос к БД не предоставляет тех же возможностей токенизации/подобия, что и индекс SOLR. Например, вместо my:property:"value" вам придется use =my:property:"value" и "value" должны быть написаны в правильном регистре, значение хранится в БД."

Это означает, что если я использую =, например, делая =@doc\:level:"value", этот запрос не будет принят в БД и будет отправлен в SOLR? Я не могу найти точное значение в БД?


person Jordi    schedule 22.10.2015    source источник
comment
Почему вы так сосредоточены на БД? Если вы настроите SOLR, будет намного быстрее запрашивать SOLR, чем БД. Ваша БД постоянно используется для хранения метаданных, а что нет, поэтому вы будете уделять больше внимания простым фактам запросов.   -  person Tahir Malik    schedule 26.10.2015


Ответы (2)


Недавно я исследовал TMQ. Я предполагаю, что вам нужна транзакционность, поэтому интересны запросы TMQ. Запросы через SOLR в конечном итоге согласуются, но TMQ немедленно вернет изменение. Есть определенные приложения, где возможная согласованность является огромной проблемой, поэтому я предполагаю, что именно поэтому вы изучаете их.

Alfresco говорит, что они используют TMQ по умолчанию, и в моем ограниченном тестировании (200 тысяч документов) я не обнаружил заметной разницы в производительности между запросом solr и TMQ. Я не могу себе представить, что они будут ужасны для производительности, если Alfresco установит его в качестве стиля по умолчанию, но мне нужно провести дальнейшее тестирование с миллионами документов, чтобы быть уверенным. Конечно, это будет зависеть от загрузки вашей базы данных. Если ваша база данных является узким местом и вам не нужны транзакции, вы можете рассмотреть возможность использования синтаксиса @ в поиске метаданных, чтобы избежать их, или вы можете отключить их с помощью конфигурации свойств.

1) Как Alfresco узнает, какие свойства я хочу проиндексировать в БД? Прочитать мой model.xml и проиндексировать только те проиндексированные свойства, которые я там указываю? Индексировать все пользовательские свойства? Или мне нужно создать скрипт для добавления этих новых индексов?

Когда вы выполняете запрос, используя синтаксис, совместимый с TMQ, Alfresco сделает это. Поведение по умолчанию — «TRANSACTIONAL_IF_POSSIBLE»: http://docs.alfresco.com/4.2/concepts/intrans-metadata-configure.html

Вам не нужно, чтобы поле было помечено как индексируемое в модели, чтобы это работало. Это неясно из документации, но я попытался отключить индексирование поля в модели, и эти запросы все еще работают. Вам даже не нужно запускать solr!

2) Другой вопрос касается синтаксиса запроса, который не поддерживается БД и направляется непосредственно в SOLR.

Ваш пример TYPE и атрибута не идет в solr. Такие вещи, как PATH, должны идти в SOLR.

3) «Любые проверки свойств должны быть выражены в форме, которая означает «проверка идентичного значения», поскольку запрос к БД не предоставляет тех же возможностей токенизации/сходства, что и индекс SOLR. Например, вместо my:property:"value" вы бы необходимо использовать =my:property:"значение" и "значение" должны быть записаны в правильном регистре, значение хранится в БД."

Они говорят, что вы должны использовать оператор =, а не оператор по умолчанию или оператор @. Оператор @ зависит от токенизации, но TMQ направляются прямо в базу данных. Однако вы можете использовать * в атрибуте, если вы опускаете "", например:

=cm:\title:Начинается с*

У меня работает на 5.0.2 через TMQ. Однако вы также можете найти точное значение.

Я надеюсь, что это прояснило это для вас. Я настоятельно рекомендую установить solr.query.fts.queryConsistency=TRANSACTIONAL, чтобы всегда использовать TMQ в тестовой среде и тестировать различные запросы, если у вас все еще есть вопросы о том, какой синтаксис поддерживается.

С уважением

person matthew p.    schedule 23.11.2015

Хорошее объяснение можно найти здесь.

https://community.alfresco.com/people/andy1/blog/2017/06/19/explaining-eventual-consistency

Когда в репозиторий вносятся изменения, SOLR принимает их с помощью механизма опроса. Необходимые обновления вносятся в механизм индексирования, чтобы синхронизировать их. Это занимает некоторое время. Index Engine вполне может находиться в состоянии, отражающем какую-то предыдущую версию репозитория. В конечном итоге он догонит и будет соответствовать репозиторию — при условии, что он не меняется навсегда.

person Lista    schedule 24.06.2017