#121 hopefully improving search

This commit is contained in:
Hamid Reza Mohammadi 2021-05-21 12:29:51 +04:30
parent ce3e4c21af
commit 3149349649
6 changed files with 126 additions and 78 deletions

View File

@ -168,7 +168,12 @@ namespace GanjooRazor.Pages
for (int i = 0; i < queryParts.Length; i++)
{
string cssClass = i % 3 == 0 ? "hilite" : i % 3 == 1 ? "hilite2" : "hilite3";
poem.PlainText = Regex.Replace(poem.PlainText, queryParts[i], $"<span class=\"{cssClass}\">{queryParts[i]}</span>", RegexOptions.IgnoreCase | RegexOptions.RightToLeft);
string finalPlainText = "";
foreach(string line in poem.PlainText.Split(Environment.NewLine, StringSplitOptions.RemoveEmptyEntries))
{
finalPlainText += $"<p>{line}</p>";
}
poem.PlainText = Regex.Replace(finalPlainText, queryParts[i], $"<span class=\"{cssClass}\">{queryParts[i]}</span>", RegexOptions.IgnoreCase | RegexOptions.RightToLeft); ;
}

View File

@ -1020,6 +1020,24 @@ namespace RMuseum.Controllers
return BadRequest(res.ExceptionString);
}
/// <summary>
/// separate verses in poem.PlainText with Environment.NewLine instead of SPACE
/// </summary>
/// <returns></returns>
[HttpPost]
[Route("regenplaintext")]
[Authorize(Policy = RMuseumSecurableItem.GanjoorEntityShortName + ":" + RMuseumSecurableItem.ImportOperationShortName)]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(bool))]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public IActionResult RegerneratePoemsPlainText()
{
RServiceResult<bool> res =
_ganjoorService.RegerneratePoemsPlainText();
if (res.Result)
return Ok();
return BadRequest(res.ExceptionString);
}
/// <summary>
/// Ganjoor Service
/// </summary>

View File

@ -891,6 +891,12 @@
</summary>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.GanjoorController.RegerneratePoemsPlainText">
<summary>
separate verses in poem.PlainText with Environment.NewLine instead of SPACE
</summary>
<returns></returns>
</member>
<member name="F:RMuseum.Controllers.GanjoorController._ganjoorService">
<summary>
Ganjoor Service
@ -6832,6 +6838,12 @@
</summary>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IGanjoorService.RegerneratePoemsPlainText">
<summary>
separate verses in poem.PlainText with Environment.NewLine instead of SPACE
</summary>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IGanjoorService.CacheCleanForPageById(System.Int32)">
<summary>
clean cache for paeg by id
@ -6852,15 +6864,6 @@
<param name="commentId"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IGanjoorService.GetVersesByQuery(System.String,System.Int32,RSecurityBackend.Models.Generic.PagingParameterModel)">
<summary>
Get Verses By query
</summary>
<param name="query"></param>
<param name="poetId"></param>
<param name="pagingParameterModel"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IGanjoorService.Search(RSecurityBackend.Models.Generic.PagingParameterModel,System.String,System.Nullable{System.Int32},System.Nullable{System.Int32})">
<summary>
Search
@ -7867,15 +7870,6 @@
<param name="recitation"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.GanjoorService.GetVersesByQuery(System.String,System.Int32,RSecurityBackend.Models.Generic.PagingParameterModel)">
<summary>
older search method
</summary>
<param name="query"></param>
<param name="poetId"></param>
<param name="paging"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.GanjoorService.GetSimilarPoems(RSecurityBackend.Models.Generic.PagingParameterModel,System.String,System.String,System.Nullable{System.Int32})">
<summary>
Get Similar Poems accroding to prosody and rhyme informations
@ -7918,6 +7912,12 @@
</summary>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.GanjoorService.RegerneratePoemsPlainText">
<summary>
separate verses in poem.PlainText with Environment.NewLine instead of SPACE
</summary>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.GanjoorService.HealthCheckContents">
<summary>
examine site pages for broken links

View File

@ -284,6 +284,12 @@ namespace RMuseum.Services
/// <returns></returns>
RServiceResult<bool> HealthCheckContents();
/// <summary>
/// separate verses in poem.PlainText with Environment.NewLine instead of SPACE
/// </summary>
/// <returns></returns>
RServiceResult<bool> RegerneratePoemsPlainText();
/// <summary>
/// clean cache for paeg by id
/// </summary>
@ -304,16 +310,6 @@ namespace RMuseum.Services
/// <returns></returns>
Task CacheCleanForComment(int commentId);
/// <summary>
/// Get Verses By query
/// </summary>
/// <param name="query"></param>
/// <param name="poetId"></param>
/// <param name="pagingParameterModel"></param>
/// <returns></returns>
Task<RServiceResult<(PaginationMetadata PagingMeta, GanjoorSearchVerseViewModel[] items)>> GetVersesByQuery(string query, int poetId,
PagingParameterModel pagingParameterModel);
/// <summary>
/// Search

View File

@ -1129,7 +1129,7 @@ namespace RMuseum.Services.Implementation
string plainText = "";
foreach(GanjoorVerse verse in verses)
{
plainText += $"{verse.Text} ";
plainText += $"{verse.Text}{Environment.NewLine}";
}
poem.PlainText = plainText.Trim();

View File

@ -1824,51 +1824,6 @@ namespace RMuseum.Services.Implementation
}
}
/// <summary>
/// older search method
/// </summary>
/// <param name="query"></param>
/// <param name="poetId"></param>
/// <param name="paging"></param>
/// <returns></returns>
public async Task<RServiceResult<(PaginationMetadata PagingMeta, GanjoorSearchVerseViewModel[] items)>> GetVersesByQuery(string query, int poetId, PagingParameterModel paging)
{
try
{
var versesQ = _context.GanjoorVerses.AsNoTracking().Include(v => v.Poem).ThenInclude(p => p.Cat)
.Where(v => v.Text.Contains(query));
if (poetId != 0)
{
versesQ = versesQ.Where(v => v.Poem.Cat.PoetId == poetId);
}
var source = versesQ.Select(
v => new GanjoorSearchVerseViewModel
{
Id = v.Id,
VOrder = v.VOrder,
VersePosition = v.VersePosition,
Text = v.Text,
PoemId = v.PoemId,
PoetId = v.Poem.Cat.PoetId,
PoemFullTitle = v.Poem.FullTitle,
PoemFullUrl = v.Poem.FullUrl,
}
);
(PaginationMetadata PagingMeta, GanjoorSearchVerseViewModel[] Items) paginatedResult =
await QueryablePaginator<GanjoorSearchVerseViewModel>.Paginate(source, paging);
return new RServiceResult<(PaginationMetadata PagingMeta, GanjoorSearchVerseViewModel[])>(paginatedResult);
}
catch (Exception exp)
{
return new RServiceResult<(PaginationMetadata PagingMeta, GanjoorSearchVerseViewModel[] Items)>((PagingMeta: null, Items: null), exp.ToString());
}
}
/// <summary>
/// Get Similar Poems accroding to prosody and rhyme informations
/// </summary>
@ -1993,17 +1948,18 @@ namespace RMuseum.Services.Implementation
string searchConditions;
if(term.IndexOf('"') == 0 && term.LastIndexOf('"') == (term.Length - 1))
{
searchConditions = term;
searchConditions = term.Replace("\"", "").Replace("'", "");
searchConditions = $"\"*{term}*\"";
}
else
{
string[] words =term.Split(' ', StringSplitOptions.RemoveEmptyEntries);
string[] words =term.Replace("\"", "").Replace("'", "").Split(' ', StringSplitOptions.RemoveEmptyEntries);
searchConditions = "";
string emptyOrAnd = "";
foreach (string word in words)
{
searchConditions += $" {emptyOrAnd} \"{word}\" ";
searchConditions += $" {emptyOrAnd} \"*{word}*\" ";
emptyOrAnd = " AND ";
}
}
@ -2216,6 +2172,79 @@ namespace RMuseum.Services.Implementation
}
}
/// <summary>
/// separate verses in poem.PlainText with Environment.NewLine instead of SPACE
/// </summary>
/// <returns></returns>
public RServiceResult<bool> RegerneratePoemsPlainText()
{
try
{
_backgroundTaskQueue.QueueBackgroundWorkItem
(
async token =>
{
using (RMuseumDbContext context = new RMuseumDbContext(new DbContextOptions<RMuseumDbContext>())) //this is long running job, so _context might be already been freed/collected by GC
{
LongRunningJobProgressServiceEF jobProgressServiceEF = new LongRunningJobProgressServiceEF(context);
var job = (await jobProgressServiceEF.NewJob("RegerneratePoemsPlainText", "Query data")).Result;
try
{
var poems = await context.GanjoorPoems.ToArrayAsync();
await jobProgressServiceEF.UpdateJob(job.Id, 0, $"Updating PlainText");
int percent = 0;
for (int i = 0; i < poems.Length; i++)
{
if (i * 100 / poems.Length > percent)
{
percent++;
await jobProgressServiceEF.UpdateJob(job.Id, percent);
}
var poem = poems[i];
List<GanjoorVerse> verses = await context.GanjoorVerses.AsNoTracking().Where(v => v.PoemId == poem.Id).OrderBy(v => v.Id).ToListAsync();
string plainText = "";
foreach (GanjoorVerse verse in verses)
{
plainText += $"{verse.Text}{Environment.NewLine}";
}
poem.PlainText = plainText.Trim();
}
await jobProgressServiceEF.UpdateJob(job.Id, 0, $"Finalizing PlainText");
context.GanjoorPoems.UpdateRange(poems);
await context.SaveChangesAsync();
await jobProgressServiceEF.UpdateJob(job.Id, 100, "", true);
}
catch (Exception exp)
{
await jobProgressServiceEF.UpdateJob(job.Id, 100, "", false, exp.ToString());
}
}
}
);
return new RServiceResult<bool>(true);
}
catch (Exception exp)
{
return new RServiceResult<bool>(false, exp.ToString());
}
}
/// <summary>
/// examine site pages for broken links
/// </summary>