Поиск командной строкой в базе знаний, по тегам и содержимому
Задача
Необходимо реализовать поиск из командной строки доступной на странице портальных пользователей, по базе знаний, не только по основному полю (название), но и по содержимому статьи и публичным тегам.
Решение
Поиск можно доработать в «строке поиска по базе знаний» страницы портального пользователя. Это отдельный элемент, похожий на командную строку, использующий ее вид, но реализация его логики содержится в схеме KnowledgeBaseSearchModule.
Эту страницу можно отладить и под обычным пользователем, в обычном интерфейсе, открыв ее как модуль данной ссылкой:
http://ваш-сайт/0/Nui/ViewModule.aspx#PortalMainPageModule/
Для реализации сложного фильтра вместо фильтра только по названию статьи, необходимо изменить следующий код, путем замещения базовой схемы KnowledgeBaseSearchModule:
/*sessionFilters.CustomFilters = { value: value, displayValue: value, primaryDisplayColumn: true };*/ var filters = Ext.create("Terrasoft.FilterGroup"); filters.addItem(Terrasoft.createColumnFilterWithParameter( Terrasoft.ComparisonType.CONTAIN, "Notes", value)); filters.addItem(Terrasoft.createColumnFilterWithParameter( Terrasoft.ComparisonType.CONTAIN, "Name", value)); filters.addItem(Terrasoft.createColumnFilterWithParameter( Terrasoft.ComparisonType.CONTAIN, "Keywords", value)); filters.logicalOperation = Terrasoft.LogicalOperatorType.OR; var serializationInfo = filters.getDefSerializationInfo(); serializationInfo.serializeFilterManagerInfo = true; sessionFilters.CustomFilters = { "null": { "displayValue": value, "filter": filters.serialize(serializationInfo) } };
Также для того, чтобы в колонку "Keywords" записывались публичные теги для последующего поиска по этой колонке, необходимо реализовать события изменения, добавления и удаления тегов базы знаний, путем создания их в замещающем объекте KnowledgeBaseInTagV2.
var userConnection = (UserConnection)HttpContext.Current.Session["UserConnection"]; Guid entityId = Entity.GetTypedColumnValue<Guid>("EntityId"); var esq = new EntitySchemaQuery(userConnection.EntitySchemaManager, "KnowledgeBaseInTagV2"); var publicTypeId = "D6FB4DE6-0809-41FE-A84F-6D245CBC5F32"; esq.AddColumn("Tag.Name"); var entityFilter = esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Entity.Id", entityId); var typeFilter = esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Tag.Type", publicTypeId); esq.Filters.Add(entityFilter); esq.Filters.Add(typeFilter); var entityCollection = esq.GetEntityCollection(userConnection); string allTags = string.Empty; foreach (var entity in entityCollection) { var tagName = entity.GetTypedColumnValue<string>("Tag_Name"); allTags += tagName + ", "; } using (DBExecutor executor = userConnection.EnsureDBConnection()) { Update updateRelationshipQuery = new Update(userConnection, "KnowledgeBase"); updateRelationshipQuery.Set("Keywords", Column.Parameter(allTags)); updateRelationshipQuery.Where("Id").IsEqual(Column.Parameter(entityId)); updateRelationshipQuery.Execute(executor); } return true;
И последнее, после публикации данных схем необходимо заполнить колонку "Keywords" публичными тегами для уже существующих записей базы знаний следующим скриптом:
UPDATE KnowledgeBase SET Keywords = ISNULL(res.Tags, '') FROM (SELECT a.Id, Tags = (SELECT stuff(( select ', ' + Name from (SELECT t.Name FROM KnowledgeBaseTagV2 t WHERE t.TypeId = 'D6FB4DE6-0809-41FE-A84F-6D245CBC5F32' and t.Id IN ( SELECT e.TagId FROM KnowledgeBaseInTagV2 e WHERE e.EntityId = a.Id ) ) tb FOR XML PATH('')), 1, 2, '')) FROM KnowledgeBase a GROUP BY a.Id) res WHERE res.ID = KnowledgeBase.Id
Где 'D6FB4DE6-0809-41FE-A84F-6D245CBC5F32' идентификатор типа "публичный тег".
Необходимые условия
Версия приложения со страницей портального пользователя и базовой схемой KnowledgeBaseSearchModule.