Questions tagged «full-text-search»

在数据库中搜索文档集合的文本或自由文本字段,以查找包含一个单词或单词组合的文档。

2
启用S​​QL Server全文索引后更新查询的速度变慢
我有一个asp.net网站,其中有许多针对我的数据库运行的插入,更新和删除查询。 几天前,我在一个表的两列上创建了全文索引。之后,我意识到当网站在该表上运行更新查询时,SQL Server进程的内存和磁盘使用率正在跳跃,更新速度变慢。在创建全文索引之前,查询运行没有任何性能问题。 我还意识到以前非常简单的更新查询现在变得很复杂,因为执行计划现在具有全文索引更新之类的功能。这是新的执行计划的一部分,该计划在启用全文本后变得很复杂: 在更新网站内容的几个小时中,我运行了5000个更新查询,并且我认为每次为每行完成全文索引过程。 我应该在开始更新行时禁用全文本扫描,然后重新启用它(如此相关问题所示)吗? 我可以告诉SQL Server在5分钟内停止全文索引编制,然后开始对新数据编制索引吗? 有更好的选择吗?我正在使用SQL Server 2012。

2
由于行估计非常不准确,导致全文搜索速度缓慢
对该数据库进行全文查询(存储RT(请求跟踪程序)票证)似乎需要很长时间才能执行。附件表(包含全文数据)约为15GB。 数据库模式如下,大约有200万行: rt4 =#\ d +附件 表“ public.attachments” 专栏 类型 修饰符| 储存| 描述 ----------------- + ----------------------------- +- -------------------------------------------------- ------ + ---------- + ------------- id | 整数| 不是null默认nextval('attachments_id_seq':: regclass)| 普通 transactionid | 整数| 不为空| 普通 父| 整数| 不为null默认值0 | 普通 messageid | 角色变化(160)| | 扩展| 主题| 字符变化(255)| | 扩展| 文件名| 字符变化(255)| …

1
不为每个表从统一查询中计算MATCH()AGAINST()分数
我正在尝试对SELECT语句的整个部分进行评分 SELECT *,MATCH(`result`) AGAINST('keyword') as `score` FROM `table1` WHERE MATCH(`result`) AGAINST('keyword') UNION SELECT *,MATCH(`content`) AGAINST('keyword') as `score` FROM `table2` WHERE MATCH(`content`) AGAINST('keyword') UNION SELECT *,MATCH(`text`) AGAINST('keyword') as `score` FROM `table3` WHERE MATCH(`text`) AGAINST('keyword') 在这种情况下,分数是每张桌子的分数+它们不是按相关性排序的 但是我尝试了这种方法,这种方法虽然有效,但不值得生产 SELECT * FROM ( SELECT *,MATCH(`result`) AGAINST('keyword') as `score` FROM `table1` WHERE MATCH(`result`) AGAINST('keyword') UNION …

1
为什么全文搜索返回的行少于LIKE
我没有像我想要的那样进行全文搜索,而且我不了解结果列表中的差异。 语句示例: SELECT `meldungstext` FROM `artikel` WHERE `meldungstext` LIKE '%punkt%' 返回92行。我收到具有匹配项的行,例如,在列meldungstext中显示“ Punkten”,“ Zwei-Punkte-Vorsprung”和“ Treffpunkt”。 我在“ meldungstext”列上设置了全文索引,并尝试了以下操作: SELECT `meldungstext` FROM `artikel` WHERE MATCH (`meldungstext`) AGAINST ('*punkt*') 这仅返回8行。我只会收到与“ Punkt”本身匹配的行,或者与“ i-Punkt”一样被视为“ Punkt”的单词。 然后,我尝试了布尔模式: SELECT `meldungstext` FROM `artikel` WHERE MATCH (`meldungstext`) AGAINST ('*punkt*' IN BOOLEAN MODE) 返回44行。我收到在meldungstext列中包含“ Zwei-Punkte-Vorsprung”或“ Treffpunkt”的行,但没有包含“ Punkten”的行。 为什么会发生这种情况?如何设置“完全”的全文搜索,以防止在子句中使用LIKE'%%'?

2
带有多列的Postgres全文搜索,为什么在索引中而不是在运行时连接?
在过去的几天里,我在postgres中遇到了全文搜索,并且在跨多列搜索时对索引有些困惑。 postgres 文档讨论了如何ts_vector在串联列上创建索引,如下所示: CREATE INDEX pgweb_idx ON pgweb USING gin(to_tsvector('english', title || ' ' || body)); 我可以这样搜索: ... WHERE (to_tsvector('english', title||' '||body) @@ to_tsquery('english', 'foo')) 但是,如果我想有时仅搜索标题,有时仅搜索正文,有时两者都搜索,则需要3个单独的索引。如果我在第三列中添加了索引,则可能是6个索引,依此类推。 我在文档中没有看到的另一种方法是只是分别索引两列,然后使用普通WHERE...OR查询: ... WHERE (to_tsvector('english', title) @@ to_tsquery('english','foo')) OR (to_tsvector('english', body) @@ to_tsquery('english','foo')) 在大约一百万行中对这两个基准进行基准测试似乎在性能上基本没有区别。 所以我的问题是: 为什么我要连接这样的索引,而不是单独索引列?两者的优点/缺点是什么? 我最好的猜测是,如果我事先知道,我只想搜索两个列(一次不搜索),那么我只需要通过串联使用较少内存的一个索引。

2
更好的“喜欢,喜欢,喜欢,喜欢,喜欢”的方法
在这个问题上,他和我有同样的问题。我需要类似的东西: select * from blablabla where product like '%rock%' or like '%paper%' or like '%scisor%' or like '%car%' or like '%pasta%' 这很丑陋,并且没有使用索引。在这种情况下,这实际上是唯一的方法(在字符串中选择多个单词),还是应该使用FULLTEXT? 据我了解,全文可以在字符串中选择多个单词。 这个问题也涉及全文

1
全文:创建多个全文索引(服务器挂起)后,许多FT_MASTER_MERGE以SUSPENDED状态等待
我们在SQL Server 2014上进行了测试,当时我们有10个数据库,每个数据库中有100个不同的架构,每个架构中有10个小表(〜50行)(总共有10K个表),并在所有这些表上创建了全文本索引所有这些数据库中的表。 几分钟后,我们发现SQL Server停止接受任何连接(ADMIN:.连接除外)。如果重新启动服务器,则可以连接,但有时会再次挂起。经过一些调查,我们发现它是由消耗所有工作线程引起的dm_os_tasks,dm_os_waiting_tasks并向我们​​显示了状态中有很多FT_MASTER_MERGE等待SUSPENDED。我们用谷歌搜索“全文正在等待主合并操作”,但没有找到更多有关它的实际信息。 我们尝试了不同的全文目录配置:每个DB一个目录,每个模式一个目录,每个索引一个目录。无论如何,服务器将所有这些挂起的任务挂起。 什么是等待的根本原因,如何解决/减轻这种等待? 在如此大量的表上启用全文的推荐方法是什么?

2
SQL Server文件表文档属性
我正在使用SQL Server 2012的Filetable来存储文档并使用Semantic Search进行搜索。 我想知道是否有办法列出所有文档属性(元数据)。有一种方法可以让“全文搜索”建立索引并搜索文档属性。我可以使用以下语句列出SQL Server索引的属性: SELECT * FROM sys.registered_search_properties; 我也可以使用SQL或使用程序来扩展此列表。 我没有找到列出实际信息的方法。我正在寻找的是一个像这样的列表: 作者:Ruud van de Beeten 标题: 测试文件 自定义属性:自定义值 谁能指出我正确的方向? 编辑:Bob Beauchemin创建了一张票,描述了我的问题。由于DMV未列出属性值,因此无法在项目中使用它。 我最终使用C#列出了OleDocumentProperties对象的自定义属性。该对象可以从Office文档中读取属性。我将继续关注这个问题,以期寻求更好的解决方案。

1
在where子句中同时包含“ contains”和“ =”时查询缓慢
以下查询大约需要10秒钟才能完成具有12k条记录的表 select top (5) * from "Physician" where "id" = 1 or contains("lastName", '"a*"') 但是如果我将where子句更改为 where "id" = 1 要么 where contains("lastName", '"a*"') 它会立即返回。 两列都被索引,lastName列也被全文索引。 CREATE TABLE Physician ( id int identity NOT NULL, firstName nvarchar(100) NOT NULL, lastName nvarchar(100) NOT NULL ); ALTER TABLE Physician ADD CONSTRAINT Physician_PK PRIMARY …

2
全文搜索速度慢,出现频率高
我有一个表,其中包含从文本文档中提取的数据。数据存储在名为"CONTENT"GIN 的列中,为此我创建了该索引: CREATE INDEX "File_contentIndex" ON "File" USING gin (setweight(to_tsvector('english'::regconfig , COALESCE("CONTENT", ''::character varying)::text), 'C'::"char")); 我使用以下查询在表上执行全文搜索: SELECT "ITEMID", ts_rank(setweight(to_tsvector('english', coalesce("CONTENT",'')), 'C') , plainto_tsquery('english', 'searchTerm')) AS "RANK" FROM "File" WHERE setweight(to_tsvector('english', coalesce("CONTENT",'')), 'C') @@ plainto_tsquery('english', 'searchTerm') ORDER BY "RANK" DESC LIMIT 5; “文件”表包含25万行,每个"CONTENT"条目均包含一个随机词和一个文本字符串,所有行均相同。 现在,当我搜索一个随机单词(整个表中有1个匹配项)时,查询运行非常快(<100毫秒)。但是,当我搜索所有行中都存在的单词时,查询运行非常慢(10分钟或更长时间)。 EXPLAIN ANALYZE显示对于1命中搜索,先执行位图索引扫描,再执行位图堆扫描。对于慢速搜索,将执行Seq扫描,这花费了很长时间。 当然,在所有行中都有相同的数据是不现实的。但是,由于我无法控制用户上载的文本文档,也无法控制用户执行的搜索,因此可能会出现类似的情况(搜索数据库中出现率很高的术语)。在这种情况下,如何提高搜索查询的性能? 运行PostgreSQL 9.3.4 查询计划EXPLAIN ANALYZE: …

1
相似度函数的最佳索引
因此,我的这张表有620万条记录,而且我必须对该列执行相似的搜索查询。查询可以是: SELECT "lca_test".* FROM "lca_test" WHERE (similarity(job_title, 'sales executive') > 0.6) AND worksite_city = 'los angeles' ORDER BY salary ASC LIMIT 50 OFFSET 0 可以在where中添加更多条件(年份= X,worksite_state = N,status =“已认证”,visa_class = Z)。 运行其中一些查询可能会花费很长时间,超过30秒。有时超过一分钟。 EXPLAIN ANALYZE 前面提到的查询给了我这个: Limit (cost=0.43..42523.04 rows=50 width=254) (actual time=9070.268..33487.734 rows=2 loops=1) -> Index Scan using index_lca_test_on_salary on lca_test …

1
结合全文本和标量索引
假设我们有一个1200万个名称和地址的数据库,这些数据库需要使用全文本进行搜索,但是每行也包含一个整数值,例如COMPANYID。该表在这1200万行中包含约250个不同的COMPANYID。 定义全文索引时,是否可以COMPANY在树中赋予每个索引自己的“分支”?


3
在全文搜索查询中优化ORDER BY
我有一张entities约有1500万条记录的大桌子。我想在其中找到与“曲棍球”匹配的前5行name。 我在上有全文索引name,该索引用于:gin_ix_entity_full_text_search_name 查询: SELECT "entities".*, ts_rank(to_tsvector('english', "entities"."name"::text), to_tsquery('english', 'hockey'::text)) AS "rank0.48661998202865475" FROM "entities" WHERE "entities"."place" = 'f' AND (to_tsvector('english', "entities"."name"::text) @@ to_tsquery('english', 'hockey'::text)) ORDER BY "rank0.48661998202865475" DESC LIMIT 5 持续时间25,623 ms 解释计划 1个限制(cost = 12666.89..12666.89行= 5宽度= 3116) 2->排序(费用= 12666.89..12670.18行= 6571宽度= 3116) 3排序键:(ts_rank(to_tsvector('english':: regconfig,(name):: text),'''hockey''':: tsquery)) 4->对实体进行位图堆扫描(cost = 124.06..12645.06行= 6571宽度= 3116) …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.