پیاده سازی Full-Text Search با SQLite و EF Core - قسمت دوم - کوئری گرفتن از جدول مجازی FTS
نویسنده: وحید نصیری
تاریخ: ۱۳۹۹/۰۲/۲۱ ۱۱:۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
private static void seedDb(ApplicationDbContext context)
{
if (!context.Chapters.Any())
{
var user1 = context.Users.Add(new User { Name = "Test User" });
context.Chapters.Add(new Chapter
{
Title = "Learn SQlite FTS5",
Text = "This tutorial teaches you how to perform full-text search in SQLite using FTS5",
User = user1.Entity
});
context.Chapters.Add(new Chapter
{
Title = "Advanced SQlite Full-text Search",
Text = "Show you some advanced techniques in SQLite full-text searching",
User = user1.Entity
});
context.Chapters.Add(new Chapter
{
Title = "SQLite Tutorial",
Text = "Help you learn SQLite quickly and effectively",
User = user1.Entity
});
context.Chapters.Add(new Chapter
{
Title = "Handle markup in text",
Text = "<p>Isn't this <font face=\"Comic Sans\">funny</font>?",
User = user1.Entity
});
context.Chapters.Add(new Chapter
{
Title = "آزمایش متن فارسی",
Text = "برای نمونه تهیه شدهاست",
User = user1.Entity
});
context.Chapters.Add(new Chapter
{
Title = "Exclude test 1",
Text = "in the years 2018-2019 something happened.",
User = user1.Entity
});
context.Chapters.Add(new Chapter
{
Title = "Exclude test 2",
Text = "It was 2018 and then it was 2019",
User = user1.Entity
});
context.SaveChanges();
}
}
select * from Chapters_FTS where Chapters_FTS match "fts5"
SELECT rowid, title, text, rank FROM Chapters_FTS WHERE Chapters_FTS MATCH "fts5"
CREATE VIRTUAL TABLE "Chapters_FTS"
USING fts5("Text", "Title", content="Chapters", content_rowid="Id") select * from Chapters_FTS where Chapters_FTS match "fts5" ORDER BY bm25(fts); select * from Chapters_FTS where Chapters_FTS match "fts5" ORDER BY rank;
namespace EFCoreSQLiteFTS.Entities
{
public class ChapterFTS
{
public int RowId { get; set; }
public decimal? Rank { get; set; }
public string Title { get; set; }
public string Text { get; set; }
}
} namespace EFCoreSQLiteFTS.DataLayer
{
public class ApplicationDbContext : DbContext
{
//...
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<ChapterFTS>().HasNoKey().ToView(null);
}
//...
}
} const string ftsSql = "SELECT rowid, title, text, rank FROM Chapters_FTS WHERE Chapters_FTS MATCH {0}";
foreach (var chapter in context.Set<ChapterFTS>().FromSqlRaw(ftsSql, "fts5"))
{
Console.WriteLine($"Title: {chapter.Title}");
Console.WriteLine($"Text: {chapter.Text}");
} SELECT rowid, title, text, rank FROM Chapters_FTS WHERE Chapters_FTS MATCH "fts5"; SELECT rowid, title, text, rank FROM Chapters_FTS WHERE Chapters_FTS = "fts5";
SELECT rowid, title, text, rank FROM Chapters_FTS WHERE Chapters_FTS MATCH "fts5" ORDER by rank;
SELECT rowid, title, text, rank FROM Chapters_FTS WHERE Chapters_FTS MATCH "learn SQLite" ORDER by rank; SELECT rowid, title, text, rank FROM Chapters_FTS WHERE Chapters_FTS MATCH "learn + SQLite" ORDER by rank;
SELECT rowid, title, text, rank FROM Chapters_FTS WHERE Chapters_FTS MATCH "search*" ORDER by rank;
SELECT rowid, title, text, rank FROM Chapters_FTS WHERE Chapters_FTS MATCH "learn text" ORDER by rank;
SELECT rowid, title, text, rank FROM Chapters_FTS WHERE Chapters_FTS MATCH "learn NOT text" ORDER by rank;
SELECT rowid, title, text, rank FROM Chapters_FTS WHERE Chapters_FTS MATCH "search AND sqlite OR help" ORDER by rank;
SELECT rowid, title, text, rank FROM Chapters_FTS WHERE Chapters_FTS MATCH "search AND (sqlite OR help)" ORDER by rank;
SELECT rowid, title, text, rank FROM Chapters_FTS WHERE Chapters_FTS MATCH "text:some AND title:sqlite" ORDER by rank;
"in the years 2018-2019 something happened" "It was 2018 and then it was 2019"
SELECT rowid, title, text, rank FROM Chapters_FTS WHERE Chapters_FTS MATCH "2018-2019" ORDER by rank;
Execution finished with errors. Result: no such column: 2019
SELECT rowid, title, text, rank FROM Chapters_FTS WHERE Chapters_FTS MATCH '"2018-2019"' ORDER by rank;
SELECT rowid, title, text, rank FROM Chapters_FTS WHERE Chapters_FTS MATCH "آزمایش" ORDER by rank;
SELECT rowid, highlight(Chapters_FTS, title, '<b>', '</b>') as title, snippet(Chapters_FTS, text, '<b>', '</b>', '...', 64) as text, rank FROM Chapters_FTS WHERE Chapters_FTS MATCH "fts5" ORDER BY rank