Публикация

Поиск командной строкой в базе знаний, по тегам и содержимому

Задача

Необходимо реализовать поиск из командной строки доступной на странице портальных пользователей, по базе знаний, не только по основному полю (название), но и по содержимому статьи и публичным тегам.

Решение

Поиск можно доработать в «строке поиска по базе знаний» страницы портального пользователя. Это отдельный элемент, похожий на командную строку, использующий ее вид, но реализация его логики содержится в схеме 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.

Нравится

Поделиться

0 комментариев
Показать все комментарии