search refactoring
This commit is contained in:
parent
175675ad99
commit
bc0573918f
|
@ -127,19 +127,19 @@ namespace Oqtane.Managers.Search
|
||||||
searchContent.Title = !string.IsNullOrEmpty(page.Title) ? page.Title : page.Name;
|
searchContent.Title = !string.IsNullOrEmpty(page.Title) ? page.Title : page.Name;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (searchContent.Properties == null)
|
if (searchContent.SearchContentProperties == null)
|
||||||
{
|
{
|
||||||
searchContent.Properties = new List<SearchContentProperty>();
|
searchContent.SearchContentProperties = new List<SearchContentProperty>();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!searchContent.Properties.Any(i => i.Name == Constants.SearchPageIdPropertyName))
|
if(!searchContent.SearchContentProperties.Any(i => i.Name == Constants.SearchPageIdPropertyName))
|
||||||
{
|
{
|
||||||
searchContent.Properties.Add(new SearchContentProperty { Name = Constants.SearchPageIdPropertyName, Value = pageModule.PageId.ToString() });
|
searchContent.SearchContentProperties.Add(new SearchContentProperty { Name = Constants.SearchPageIdPropertyName, Value = pageModule.PageId.ToString() });
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!searchContent.Properties.Any(i => i.Name == Constants.SearchModuleIdPropertyName))
|
if (!searchContent.SearchContentProperties.Any(i => i.Name == Constants.SearchModuleIdPropertyName))
|
||||||
{
|
{
|
||||||
searchContent.Properties.Add(new SearchContentProperty { Name = Constants.SearchModuleIdPropertyName, Value = pageModule.ModuleId.ToString() });
|
searchContent.SearchContentProperties.Add(new SearchContentProperty { Name = Constants.SearchModuleIdPropertyName, Value = pageModule.ModuleId.ToString() });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,7 @@ namespace Oqtane.Managers.Search
|
||||||
public string GetUrl(SearchResult searchResult, SearchQuery searchQuery)
|
public string GetUrl(SearchResult searchResult, SearchQuery searchQuery)
|
||||||
{
|
{
|
||||||
var pageRepository = _serviceProvider.GetRequiredService<IPageRepository>();
|
var pageRepository = _serviceProvider.GetRequiredService<IPageRepository>();
|
||||||
var pageIdValue = searchResult.Properties?.FirstOrDefault(i => i.Name == Constants.SearchPageIdPropertyName)?.Value ?? string.Empty;
|
var pageIdValue = searchResult.SearchContentProperties?.FirstOrDefault(i => i.Name == Constants.SearchPageIdPropertyName)?.Value ?? string.Empty;
|
||||||
if(!string.IsNullOrEmpty(pageIdValue) && int.TryParse(pageIdValue, out int pageId))
|
if(!string.IsNullOrEmpty(pageIdValue) && int.TryParse(pageIdValue, out int pageId))
|
||||||
{
|
{
|
||||||
var page = pageRepository.GetPage(pageId);
|
var page = pageRepository.GetPage(pageId);
|
||||||
|
@ -39,7 +39,7 @@ namespace Oqtane.Managers.Search
|
||||||
|
|
||||||
public bool Visible(SearchContent searchResult, SearchQuery searchQuery)
|
public bool Visible(SearchContent searchResult, SearchQuery searchQuery)
|
||||||
{
|
{
|
||||||
var pageIdValue = searchResult.Properties?.FirstOrDefault(i => i.Name == Constants.SearchPageIdPropertyName)?.Value ?? string.Empty;
|
var pageIdValue = searchResult.SearchContentProperties?.FirstOrDefault(i => i.Name == Constants.SearchPageIdPropertyName)?.Value ?? string.Empty;
|
||||||
if (!string.IsNullOrEmpty(pageIdValue) && int.TryParse(pageIdValue, out int pageId))
|
if (!string.IsNullOrEmpty(pageIdValue) && int.TryParse(pageIdValue, out int pageId))
|
||||||
{
|
{
|
||||||
return CanViewPage(pageId, searchQuery.User);
|
return CanViewPage(pageId, searchQuery.User);
|
||||||
|
|
|
@ -64,14 +64,14 @@ namespace Oqtane.Managers.Search
|
||||||
IsActive = !page.IsDeleted && Utilities.IsPageModuleVisible(page.EffectiveDate, page.ExpiryDate)
|
IsActive = !page.IsDeleted && Utilities.IsPageModuleVisible(page.EffectiveDate, page.ExpiryDate)
|
||||||
};
|
};
|
||||||
|
|
||||||
if (searchContent.Properties == null)
|
if (searchContent.SearchContentProperties == null)
|
||||||
{
|
{
|
||||||
searchContent.Properties = new List<SearchContentProperty>();
|
searchContent.SearchContentProperties = new List<SearchContentProperty>();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!searchContent.Properties.Any(i => i.Name == Constants.SearchPageIdPropertyName))
|
if (!searchContent.SearchContentProperties.Any(i => i.Name == Constants.SearchPageIdPropertyName))
|
||||||
{
|
{
|
||||||
searchContent.Properties.Add(new SearchContentProperty { Name = Constants.SearchPageIdPropertyName, Value = page.PageId.ToString() });
|
searchContent.SearchContentProperties.Add(new SearchContentProperty { Name = Constants.SearchPageIdPropertyName, Value = page.PageId.ToString() });
|
||||||
}
|
}
|
||||||
|
|
||||||
searchContentList.Add(searchContent);
|
searchContentList.Add(searchContent);
|
||||||
|
|
|
@ -1,42 +0,0 @@
|
||||||
using Microsoft.EntityFrameworkCore.Migrations;
|
|
||||||
using Microsoft.EntityFrameworkCore.Migrations.Operations;
|
|
||||||
using Microsoft.EntityFrameworkCore.Migrations.Operations.Builders;
|
|
||||||
using Oqtane.Databases.Interfaces;
|
|
||||||
|
|
||||||
namespace Oqtane.Migrations.EntityBuilders
|
|
||||||
{
|
|
||||||
public class SearchContentWordsEntityBuilder : BaseEntityBuilder<SearchContentWordsEntityBuilder>
|
|
||||||
{
|
|
||||||
private const string _entityTableName = "SearchContentWords";
|
|
||||||
private readonly PrimaryKey<SearchContentWordsEntityBuilder> _primaryKey = new("PK_SearchContentWords", x => x.WordId);
|
|
||||||
private readonly ForeignKey<SearchContentWordsEntityBuilder> _searchContentForeignKey = new("FK_SearchContentWords_SearchContent", x => x.SearchContentId, "SearchContent", "SearchContentId", ReferentialAction.Cascade);
|
|
||||||
private readonly ForeignKey<SearchContentWordsEntityBuilder> _wordSourceForeignKey = new("FK_SearchContentWords_WordSource", x => x.WordSourceId, "SearchContentWordSource", "WordSourceId", ReferentialAction.Cascade);
|
|
||||||
|
|
||||||
public SearchContentWordsEntityBuilder(MigrationBuilder migrationBuilder, IDatabase database) : base(migrationBuilder, database)
|
|
||||||
{
|
|
||||||
EntityTableName = _entityTableName;
|
|
||||||
PrimaryKey = _primaryKey;
|
|
||||||
|
|
||||||
ForeignKeys.Add(_searchContentForeignKey);
|
|
||||||
ForeignKeys.Add(_wordSourceForeignKey);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override SearchContentWordsEntityBuilder BuildTable(ColumnsBuilder table)
|
|
||||||
{
|
|
||||||
WordId = AddAutoIncrementColumn(table, "WordId");
|
|
||||||
SearchContentId = AddIntegerColumn(table, "SearchContentId");
|
|
||||||
WordSourceId = AddIntegerColumn(table, "WordSourceId");
|
|
||||||
Count = AddIntegerColumn(table, "Count");
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public OperationBuilder<AddColumnOperation> WordId { get; private set; }
|
|
||||||
|
|
||||||
public OperationBuilder<AddColumnOperation> SearchContentId { get; private set; }
|
|
||||||
|
|
||||||
public OperationBuilder<AddColumnOperation> WordSourceId { get; private set; }
|
|
||||||
|
|
||||||
public OperationBuilder<AddColumnOperation> Count { get; private set; }
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
using Microsoft.EntityFrameworkCore.Migrations.Operations;
|
||||||
|
using Microsoft.EntityFrameworkCore.Migrations.Operations.Builders;
|
||||||
|
using Oqtane.Databases.Interfaces;
|
||||||
|
|
||||||
|
namespace Oqtane.Migrations.EntityBuilders
|
||||||
|
{
|
||||||
|
public class SearchContentWordEntityBuilder : BaseEntityBuilder<SearchContentWordEntityBuilder>
|
||||||
|
{
|
||||||
|
private const string _entityTableName = "SearchContentWord";
|
||||||
|
private readonly PrimaryKey<SearchContentWordEntityBuilder> _primaryKey = new("PK_SearchContentWord", x => x.SearchWordId);
|
||||||
|
private readonly ForeignKey<SearchContentWordEntityBuilder> _foreignKey1 = new("FK_SearchContentWord_SearchContent", x => x.SearchContentId, "SearchContent", "SearchContentId", ReferentialAction.Cascade);
|
||||||
|
private readonly ForeignKey<SearchContentWordEntityBuilder> _foreignKey2 = new("FK_SearchContentWord_SearchWord", x => x.SearchWordId, "SearchWord", "SearchWordId", ReferentialAction.Cascade);
|
||||||
|
|
||||||
|
public SearchContentWordEntityBuilder(MigrationBuilder migrationBuilder, IDatabase database) : base(migrationBuilder, database)
|
||||||
|
{
|
||||||
|
EntityTableName = _entityTableName;
|
||||||
|
PrimaryKey = _primaryKey;
|
||||||
|
ForeignKeys.Add(_foreignKey1);
|
||||||
|
ForeignKeys.Add(_foreignKey2);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override SearchContentWordEntityBuilder BuildTable(ColumnsBuilder table)
|
||||||
|
{
|
||||||
|
SearchContentWordId = AddAutoIncrementColumn(table, "SearchContentWordId");
|
||||||
|
SearchContentId = AddIntegerColumn(table, "SearchContentId");
|
||||||
|
SearchWordId = AddIntegerColumn(table, "SearchWordId");
|
||||||
|
Count = AddIntegerColumn(table, "Count");
|
||||||
|
CreatedOn = AddDateTimeColumn(table, "CreatedOn");
|
||||||
|
ModifiedOn = AddDateTimeColumn(table, "ModifiedOn");
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OperationBuilder<AddColumnOperation> SearchContentWordId { get; private set; }
|
||||||
|
|
||||||
|
public OperationBuilder<AddColumnOperation> SearchContentId { get; private set; }
|
||||||
|
|
||||||
|
public OperationBuilder<AddColumnOperation> SearchWordId { get; private set; }
|
||||||
|
|
||||||
|
public OperationBuilder<AddColumnOperation> Count { get; private set; }
|
||||||
|
|
||||||
|
public OperationBuilder<AddColumnOperation> CreatedOn { get; private set; }
|
||||||
|
|
||||||
|
public OperationBuilder<AddColumnOperation> ModifiedOn { get; private set; }
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,31 +0,0 @@
|
||||||
using Microsoft.EntityFrameworkCore.Migrations;
|
|
||||||
using Microsoft.EntityFrameworkCore.Migrations.Operations;
|
|
||||||
using Microsoft.EntityFrameworkCore.Migrations.Operations.Builders;
|
|
||||||
using Oqtane.Databases.Interfaces;
|
|
||||||
|
|
||||||
namespace Oqtane.Migrations.EntityBuilders
|
|
||||||
{
|
|
||||||
public class SearchContentWordSourceEntityBuilder : BaseEntityBuilder<SearchContentWordSourceEntityBuilder>
|
|
||||||
{
|
|
||||||
private const string _entityTableName = "SearchContentWordSource";
|
|
||||||
private readonly PrimaryKey<SearchContentWordSourceEntityBuilder> _primaryKey = new("PK_SearchContentWordSource", x => x.WordSourceId);
|
|
||||||
|
|
||||||
public SearchContentWordSourceEntityBuilder(MigrationBuilder migrationBuilder, IDatabase database) : base(migrationBuilder, database)
|
|
||||||
{
|
|
||||||
EntityTableName = _entityTableName;
|
|
||||||
PrimaryKey = _primaryKey;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override SearchContentWordSourceEntityBuilder BuildTable(ColumnsBuilder table)
|
|
||||||
{
|
|
||||||
WordSourceId = AddAutoIncrementColumn(table, "WordSourceId");
|
|
||||||
Word = AddStringColumn(table, "Word", 255);
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public OperationBuilder<AddColumnOperation> WordSourceId { get; private set; }
|
|
||||||
|
|
||||||
public OperationBuilder<AddColumnOperation> Word { get; private set; }
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
using Microsoft.EntityFrameworkCore.Migrations.Operations;
|
||||||
|
using Microsoft.EntityFrameworkCore.Migrations.Operations.Builders;
|
||||||
|
using Oqtane.Databases.Interfaces;
|
||||||
|
|
||||||
|
namespace Oqtane.Migrations.EntityBuilders
|
||||||
|
{
|
||||||
|
public class SearchWordEntityBuilder : BaseEntityBuilder<SearchWordEntityBuilder>
|
||||||
|
{
|
||||||
|
private const string _entityTableName = "SearchWord";
|
||||||
|
private readonly PrimaryKey<SearchWordEntityBuilder> _primaryKey = new("PK_SearchWord", x => x.SearchWordId);
|
||||||
|
|
||||||
|
public SearchWordEntityBuilder(MigrationBuilder migrationBuilder, IDatabase database) : base(migrationBuilder, database)
|
||||||
|
{
|
||||||
|
EntityTableName = _entityTableName;
|
||||||
|
PrimaryKey = _primaryKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override SearchWordEntityBuilder BuildTable(ColumnsBuilder table)
|
||||||
|
{
|
||||||
|
SearchWordId = AddAutoIncrementColumn(table, "SearchWordId");
|
||||||
|
Word = AddStringColumn(table, "Word", 255);
|
||||||
|
CreatedOn = AddDateTimeColumn(table, "CreatedOn");
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OperationBuilder<AddColumnOperation> SearchWordId { get; private set; }
|
||||||
|
|
||||||
|
public OperationBuilder<AddColumnOperation> Word { get; private set; }
|
||||||
|
|
||||||
|
public OperationBuilder<AddColumnOperation> CreatedOn { get; private set; }
|
||||||
|
}
|
||||||
|
}
|
|
@ -23,22 +23,22 @@ namespace Oqtane.Migrations.Tenant
|
||||||
var searchContentPropertyEntityBuilder = new SearchContentPropertyEntityBuilder(migrationBuilder, ActiveDatabase);
|
var searchContentPropertyEntityBuilder = new SearchContentPropertyEntityBuilder(migrationBuilder, ActiveDatabase);
|
||||||
searchContentPropertyEntityBuilder.Create();
|
searchContentPropertyEntityBuilder.Create();
|
||||||
|
|
||||||
var searchContentWordSourceEntityBuilder = new SearchContentWordSourceEntityBuilder(migrationBuilder, ActiveDatabase);
|
var searchWordEntityBuilder = new SearchWordEntityBuilder(migrationBuilder, ActiveDatabase);
|
||||||
searchContentWordSourceEntityBuilder.Create();
|
searchWordEntityBuilder.Create();
|
||||||
searchContentWordSourceEntityBuilder.AddIndex("IX_SearchContentWordSource", "Word", true);
|
searchWordEntityBuilder.AddIndex("IX_SearchWord", "Word", true);
|
||||||
|
|
||||||
var searchContentWordsEntityBuilder = new SearchContentWordsEntityBuilder(migrationBuilder, ActiveDatabase);
|
var searchContentWordEntityBuilder = new SearchContentWordEntityBuilder(migrationBuilder, ActiveDatabase);
|
||||||
searchContentWordsEntityBuilder.Create();
|
searchContentWordEntityBuilder.Create();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void Down(MigrationBuilder migrationBuilder)
|
protected override void Down(MigrationBuilder migrationBuilder)
|
||||||
{
|
{
|
||||||
var searchContentWordsEntityBuilder = new SearchContentWordsEntityBuilder(migrationBuilder, ActiveDatabase);
|
var searchContentWordEntityBuilder = new SearchContentWordEntityBuilder(migrationBuilder, ActiveDatabase);
|
||||||
searchContentWordsEntityBuilder.Drop();
|
searchContentWordEntityBuilder.Drop();
|
||||||
|
|
||||||
var searchContentWordSourceEntityBuilder = new SearchContentWordSourceEntityBuilder(migrationBuilder, ActiveDatabase);
|
var searchWordEntityBuilder = new SearchWordEntityBuilder(migrationBuilder, ActiveDatabase);
|
||||||
searchContentWordSourceEntityBuilder.DropIndex("IX_SearchContentWordSource");
|
searchWordEntityBuilder.DropIndex("IX_SearchWord");
|
||||||
searchContentWordSourceEntityBuilder.Drop();
|
searchWordEntityBuilder.Drop();
|
||||||
|
|
||||||
var searchContentPropertyEntityBuilder = new SearchContentPropertyEntityBuilder(migrationBuilder, ActiveDatabase);
|
var searchContentPropertyEntityBuilder = new SearchContentPropertyEntityBuilder(migrationBuilder, ActiveDatabase);
|
||||||
searchContentPropertyEntityBuilder.Drop();
|
searchContentPropertyEntityBuilder.Drop();
|
||||||
|
|
|
@ -4,13 +4,11 @@ using System.Linq;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Xml;
|
|
||||||
using HtmlAgilityPack;
|
using HtmlAgilityPack;
|
||||||
using Oqtane.Models;
|
using Oqtane.Models;
|
||||||
using Oqtane.Repository;
|
using Oqtane.Repository;
|
||||||
using Oqtane.Services;
|
using Oqtane.Services;
|
||||||
using Oqtane.Shared;
|
using Oqtane.Shared;
|
||||||
using static Microsoft.Extensions.Logging.EventSource.LoggingEventSource;
|
|
||||||
|
|
||||||
namespace Oqtane.Providers
|
namespace Oqtane.Providers
|
||||||
{
|
{
|
||||||
|
@ -64,7 +62,7 @@ namespace Oqtane.Providers
|
||||||
{
|
{
|
||||||
var totalResults = 0;
|
var totalResults = 0;
|
||||||
|
|
||||||
var searchContentList = await _searchContentRepository.GetSearchContentListAsync(searchQuery);
|
var searchContentList = await _searchContentRepository.GetSearchContentsAsync(searchQuery);
|
||||||
|
|
||||||
//convert the search content to search results.
|
//convert the search content to search results.
|
||||||
var results = searchContentList
|
var results = searchContentList
|
||||||
|
@ -107,7 +105,7 @@ namespace Oqtane.Providers
|
||||||
{
|
{
|
||||||
if (i.EntityName == EntityNames.Page || i.EntityName == EntityNames.Module)
|
if (i.EntityName == EntityNames.Page || i.EntityName == EntityNames.Module)
|
||||||
{
|
{
|
||||||
var pageId = i.Properties.FirstOrDefault(p => p.Name == Constants.SearchPageIdPropertyName)?.Value ?? string.Empty;
|
var pageId = i.SearchContentProperties.FirstOrDefault(p => p.Name == Constants.SearchPageIdPropertyName)?.Value ?? string.Empty;
|
||||||
return !string.IsNullOrEmpty(pageId) ? pageId : i.UniqueKey;
|
return !string.IsNullOrEmpty(pageId) ? pageId : i.UniqueKey;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -138,7 +136,7 @@ namespace Oqtane.Providers
|
||||||
Body = searchContent.Body,
|
Body = searchContent.Body,
|
||||||
Url = searchContent.Url,
|
Url = searchContent.Url,
|
||||||
ModifiedTime = searchContent.ModifiedTime,
|
ModifiedTime = searchContent.ModifiedTime,
|
||||||
Properties = searchContent.Properties,
|
SearchContentProperties = searchContent.SearchContentProperties,
|
||||||
Snippet = BuildSnippet(searchContent, searchQuery),
|
Snippet = BuildSnippet(searchContent, searchQuery),
|
||||||
Score = CalculateScore(searchContent, searchQuery)
|
Score = CalculateScore(searchContent, searchQuery)
|
||||||
};
|
};
|
||||||
|
@ -151,7 +149,7 @@ namespace Oqtane.Providers
|
||||||
var score = 0f;
|
var score = 0f;
|
||||||
foreach (var keyword in SearchUtils.GetKeywordsList(searchQuery.Keywords))
|
foreach (var keyword in SearchUtils.GetKeywordsList(searchQuery.Keywords))
|
||||||
{
|
{
|
||||||
score += searchContent.Words.Where(i => i.WordSource.Word.StartsWith(keyword)).Sum(i => i.Count);
|
score += searchContent.SearchContentWords.Where(i => i.SearchWord.Word.StartsWith(keyword)).Sum(i => i.Count);
|
||||||
}
|
}
|
||||||
|
|
||||||
return score / 100;
|
return score / 100;
|
||||||
|
@ -206,31 +204,34 @@ namespace Oqtane.Providers
|
||||||
//analyze the search content and save the index words
|
//analyze the search content and save the index words
|
||||||
var indexContent = $"{searchContent.Title} {searchContent.Description} {searchContent.Body} {searchContent.AdditionalContent}";
|
var indexContent = $"{searchContent.Title} {searchContent.Description} {searchContent.Body} {searchContent.AdditionalContent}";
|
||||||
var words = GetWords(indexContent, WordMinLength);
|
var words = GetWords(indexContent, WordMinLength);
|
||||||
var existWords = _searchContentRepository.GetWords(searchContent.SearchContentId);
|
var existingSearchContentWords = _searchContentRepository.GetSearchContentWords(searchContent.SearchContentId);
|
||||||
foreach (var kvp in words)
|
foreach (var kvp in words)
|
||||||
{
|
{
|
||||||
var word = existWords.FirstOrDefault(i => i.WordSource.Word == kvp.Key);
|
var searchContentWord = existingSearchContentWords.FirstOrDefault(i => i.SearchWord.Word == kvp.Key);
|
||||||
if (word != null)
|
if (searchContentWord != null)
|
||||||
{
|
{
|
||||||
word.Count = kvp.Value;
|
searchContentWord.Count = kvp.Value;
|
||||||
_searchContentRepository.UpdateSearchContentWords(word);
|
searchContentWord.ModifiedOn = DateTime.UtcNow;
|
||||||
|
_searchContentRepository.UpdateSearchContentWord(searchContentWord);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var wordSource = _searchContentRepository.GetSearchContentWordSource(kvp.Key);
|
var searchWord = _searchContentRepository.GetSearchWord(kvp.Key);
|
||||||
if (wordSource == null)
|
if (searchWord == null)
|
||||||
{
|
{
|
||||||
wordSource = _searchContentRepository.AddSearchContentWordSource(new SearchContentWordSource { Word = kvp.Key });
|
searchWord = _searchContentRepository.AddSearchWord(new SearchWord { Word = kvp.Key, CreatedOn = DateTime.UtcNow });
|
||||||
}
|
}
|
||||||
|
|
||||||
word = new SearchContentWords
|
searchContentWord = new SearchContentWord
|
||||||
{
|
{
|
||||||
SearchContentId = searchContent.SearchContentId,
|
SearchContentId = searchContent.SearchContentId,
|
||||||
WordSourceId = wordSource.WordSourceId,
|
SearchWordId = searchWord.SearchWordId,
|
||||||
Count = kvp.Value
|
Count = kvp.Value,
|
||||||
|
CreatedOn = DateTime.UtcNow,
|
||||||
|
ModifiedOn = DateTime.UtcNow
|
||||||
};
|
};
|
||||||
|
|
||||||
_searchContentRepository.AddSearchContentWords(word);
|
_searchContentRepository.AddSearchContentWord(searchContentWord);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,7 @@ namespace Oqtane.Repository
|
||||||
public virtual DbSet<UrlMapping> UrlMapping { get; set; }
|
public virtual DbSet<UrlMapping> UrlMapping { get; set; }
|
||||||
public virtual DbSet<SearchContent> SearchContent { get; set; }
|
public virtual DbSet<SearchContent> SearchContent { get; set; }
|
||||||
public virtual DbSet<SearchContentProperty> SearchContentProperty { get; set; }
|
public virtual DbSet<SearchContentProperty> SearchContentProperty { get; set; }
|
||||||
public virtual DbSet<SearchContentWords> SearchContentWords { get; set; }
|
public virtual DbSet<SearchContentWord> SearchContentWord { get; set; }
|
||||||
public virtual DbSet<SearchContentWordSource> SearchContentWordSource { get; set; }
|
public virtual DbSet<SearchWord> SearchWord { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,18 +7,18 @@ namespace Oqtane.Repository
|
||||||
{
|
{
|
||||||
public interface ISearchContentRepository
|
public interface ISearchContentRepository
|
||||||
{
|
{
|
||||||
Task<IEnumerable<SearchContent>> GetSearchContentListAsync(SearchQuery searchQuery);
|
Task<IEnumerable<SearchContent>> GetSearchContentsAsync(SearchQuery searchQuery);
|
||||||
SearchContent AddSearchContent(SearchContent searchContent);
|
SearchContent AddSearchContent(SearchContent searchContent);
|
||||||
void DeleteSearchContent(int searchContentId);
|
void DeleteSearchContent(int searchContentId);
|
||||||
void DeleteSearchContent(string entityName, int entryId);
|
void DeleteSearchContent(string entityName, int entryId);
|
||||||
void DeleteSearchContent(string uniqueKey);
|
void DeleteSearchContent(string uniqueKey);
|
||||||
void DeleteAllSearchContent();
|
void DeleteAllSearchContent();
|
||||||
|
|
||||||
SearchContentWordSource GetSearchContentWordSource(string word);
|
SearchWord GetSearchWord(string word);
|
||||||
SearchContentWordSource AddSearchContentWordSource(SearchContentWordSource wordSource);
|
SearchWord AddSearchWord(SearchWord searchWord);
|
||||||
|
|
||||||
IEnumerable<SearchContentWords> GetWords(int searchContentId);
|
IEnumerable<SearchContentWord> GetSearchContentWords(int searchContentId);
|
||||||
SearchContentWords AddSearchContentWords(SearchContentWords word);
|
SearchContentWord AddSearchContentWord(SearchContentWord searchContentWord);
|
||||||
SearchContentWords UpdateSearchContentWords(SearchContentWords word);
|
SearchContentWord UpdateSearchContentWord(SearchContentWord searchContentWord);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,13 +17,13 @@ namespace Oqtane.Repository
|
||||||
_dbContextFactory = dbContextFactory;
|
_dbContextFactory = dbContextFactory;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IEnumerable<SearchContent>> GetSearchContentListAsync(SearchQuery searchQuery)
|
public async Task<IEnumerable<SearchContent>> GetSearchContentsAsync(SearchQuery searchQuery)
|
||||||
{
|
{
|
||||||
using var db = _dbContextFactory.CreateDbContext();
|
using var db = _dbContextFactory.CreateDbContext();
|
||||||
var searchContentList = db.SearchContent.AsNoTracking()
|
var searchContentList = db.SearchContent.AsNoTracking()
|
||||||
.Include(i => i.Properties)
|
.Include(i => i.SearchContentProperties)
|
||||||
.Include(i => i.Words)
|
.Include(i => i.SearchContentWords)
|
||||||
.ThenInclude(w => w.WordSource)
|
.ThenInclude(w => w.SearchWord)
|
||||||
.Where(i => i.SiteId == searchQuery.SiteId && i.IsActive);
|
.Where(i => i.SiteId == searchQuery.SiteId && i.IsActive);
|
||||||
|
|
||||||
if (searchQuery.EntityNames != null && searchQuery.EntityNames.Any())
|
if (searchQuery.EntityNames != null && searchQuery.EntityNames.Any())
|
||||||
|
@ -45,7 +45,7 @@ namespace Oqtane.Repository
|
||||||
{
|
{
|
||||||
foreach (var property in searchQuery.Properties)
|
foreach (var property in searchQuery.Properties)
|
||||||
{
|
{
|
||||||
searchContentList = searchContentList.Where(i => i.Properties.Any(p => p.Name == property.Key && p.Value == property.Value));
|
searchContentList = searchContentList.Where(i => i.SearchContentProperties.Any(p => p.Name == property.Key && p.Value == property.Value));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -54,7 +54,7 @@ namespace Oqtane.Repository
|
||||||
{
|
{
|
||||||
foreach (var keyword in SearchUtils.GetKeywordsList(searchQuery.Keywords))
|
foreach (var keyword in SearchUtils.GetKeywordsList(searchQuery.Keywords))
|
||||||
{
|
{
|
||||||
filteredContentList.AddRange(await searchContentList.Where(i => i.Words.Any(w => w.WordSource.Word.StartsWith(keyword))).ToListAsync());
|
filteredContentList.AddRange(await searchContentList.Where(i => i.SearchContentWords.Any(w => w.SearchWord.Word.StartsWith(keyword))).ToListAsync());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -66,9 +66,9 @@ namespace Oqtane.Repository
|
||||||
using var context = _dbContextFactory.CreateDbContext();
|
using var context = _dbContextFactory.CreateDbContext();
|
||||||
context.SearchContent.Add(searchContent);
|
context.SearchContent.Add(searchContent);
|
||||||
|
|
||||||
if(searchContent.Properties != null && searchContent.Properties.Any())
|
if(searchContent.SearchContentProperties != null && searchContent.SearchContentProperties.Any())
|
||||||
{
|
{
|
||||||
foreach(var property in searchContent.Properties)
|
foreach(var property in searchContent.SearchContentProperties)
|
||||||
{
|
{
|
||||||
property.SearchContentId = searchContent.SearchContentId;
|
property.SearchContentId = searchContent.SearchContentId;
|
||||||
context.SearchContentProperty.Add(property);
|
context.SearchContentProperty.Add(property);
|
||||||
|
@ -117,7 +117,7 @@ namespace Oqtane.Repository
|
||||||
db.SaveChanges();
|
db.SaveChanges();
|
||||||
}
|
}
|
||||||
|
|
||||||
public SearchContentWordSource GetSearchContentWordSource(string word)
|
public SearchWord GetSearchWord(string word)
|
||||||
{
|
{
|
||||||
if(string.IsNullOrEmpty(word))
|
if(string.IsNullOrEmpty(word))
|
||||||
{
|
{
|
||||||
|
@ -125,45 +125,45 @@ namespace Oqtane.Repository
|
||||||
}
|
}
|
||||||
|
|
||||||
using var db = _dbContextFactory.CreateDbContext();
|
using var db = _dbContextFactory.CreateDbContext();
|
||||||
return db.SearchContentWordSource.FirstOrDefault(i => i.Word == word);
|
return db.SearchWord.FirstOrDefault(i => i.Word == word);
|
||||||
}
|
}
|
||||||
|
|
||||||
public SearchContentWordSource AddSearchContentWordSource(SearchContentWordSource wordSource)
|
public SearchWord AddSearchWord(SearchWord searchWord)
|
||||||
{
|
{
|
||||||
using var db = _dbContextFactory.CreateDbContext();
|
using var db = _dbContextFactory.CreateDbContext();
|
||||||
|
|
||||||
db.SearchContentWordSource.Add(wordSource);
|
db.SearchWord.Add(searchWord);
|
||||||
db.SaveChanges();
|
db.SaveChanges();
|
||||||
|
|
||||||
return wordSource;
|
return searchWord;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<SearchContentWords> GetWords(int searchContentId)
|
public IEnumerable<SearchContentWord> GetSearchContentWords(int searchContentId)
|
||||||
{
|
{
|
||||||
using var db = _dbContextFactory.CreateDbContext();
|
using var db = _dbContextFactory.CreateDbContext();
|
||||||
return db.SearchContentWords
|
return db.SearchContentWord
|
||||||
.Include(i => i.WordSource)
|
.Include(i => i.SearchWord)
|
||||||
.Where(i => i.SearchContentId == searchContentId).ToList();
|
.Where(i => i.SearchContentId == searchContentId).ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
public SearchContentWords AddSearchContentWords(SearchContentWords word)
|
public SearchContentWord AddSearchContentWord(SearchContentWord searchContentWord)
|
||||||
{
|
{
|
||||||
using var db = _dbContextFactory.CreateDbContext();
|
using var db = _dbContextFactory.CreateDbContext();
|
||||||
|
|
||||||
db.SearchContentWords.Add(word);
|
db.SearchContentWord.Add(searchContentWord);
|
||||||
db.SaveChanges();
|
db.SaveChanges();
|
||||||
|
|
||||||
return word;
|
return searchContentWord;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SearchContentWords UpdateSearchContentWords(SearchContentWords word)
|
public SearchContentWord UpdateSearchContentWord(SearchContentWord searchContentWord)
|
||||||
{
|
{
|
||||||
using var db = _dbContextFactory.CreateDbContext();
|
using var db = _dbContextFactory.CreateDbContext();
|
||||||
|
|
||||||
db.Entry(word).State = EntityState.Modified;
|
db.Entry(searchContentWord).State = EntityState.Modified;
|
||||||
db.SaveChanges();
|
db.SaveChanges();
|
||||||
|
|
||||||
return word;
|
return searchContentWord;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,9 +31,9 @@ namespace Oqtane.Models
|
||||||
|
|
||||||
public string AdditionalContent { get; set; }
|
public string AdditionalContent { get; set; }
|
||||||
|
|
||||||
public IList<SearchContentProperty> Properties { get; set; }
|
public IList<SearchContentProperty> SearchContentProperties { get; set; }
|
||||||
|
|
||||||
public IList<SearchContentWords> Words { get; set; }
|
public IList<SearchContentWord> SearchContentWords { get; set; }
|
||||||
|
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
{
|
{
|
||||||
|
|
24
Oqtane.Shared/Models/SearchContentWord.cs
Normal file
24
Oqtane.Shared/Models/SearchContentWord.cs
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
using System;
|
||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
|
||||||
|
namespace Oqtane.Models
|
||||||
|
{
|
||||||
|
public class SearchContentWord
|
||||||
|
{
|
||||||
|
[Key]
|
||||||
|
public int SearchContentWordId { get; set; }
|
||||||
|
|
||||||
|
public int SearchContentId { get; set; }
|
||||||
|
|
||||||
|
public int SearchWordId { get; set; }
|
||||||
|
|
||||||
|
public int Count { get; set; }
|
||||||
|
|
||||||
|
public DateTime CreatedOn { get; set; }
|
||||||
|
|
||||||
|
public DateTime ModifiedOn { get; set; }
|
||||||
|
|
||||||
|
public SearchWord SearchWord { get; set; }
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,19 +0,0 @@
|
||||||
using System.ComponentModel.DataAnnotations;
|
|
||||||
using System.ComponentModel.DataAnnotations.Schema;
|
|
||||||
|
|
||||||
namespace Oqtane.Models
|
|
||||||
{
|
|
||||||
public class SearchContentWords
|
|
||||||
{
|
|
||||||
[Key]
|
|
||||||
public int WordId { get; set; }
|
|
||||||
|
|
||||||
public int SearchContentId { get; set; }
|
|
||||||
|
|
||||||
public int WordSourceId { get; set; }
|
|
||||||
|
|
||||||
public int Count { get; set; }
|
|
||||||
|
|
||||||
public SearchContentWordSource WordSource { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,12 +1,15 @@
|
||||||
|
using System;
|
||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
|
||||||
namespace Oqtane.Models
|
namespace Oqtane.Models
|
||||||
{
|
{
|
||||||
public class SearchContentWordSource
|
public class SearchWord
|
||||||
{
|
{
|
||||||
[Key]
|
[Key]
|
||||||
public int WordSourceId { get; set; }
|
public int SearchWordId { get; set; }
|
||||||
|
|
||||||
public string Word { get; set; }
|
public string Word { get; set; }
|
||||||
|
|
||||||
|
public DateTime CreatedOn { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user