我有一个搜索表,比如说要搜索的4列文本数据.
我做这样的事情:
SELECT * FROM dbo.SearchTable
WHERE CONTAINS((co1, col2, col3, col4), 'term1 AND term2')
Run Code Online (Sandbox Code Playgroud)
如果term1和term2在同一列中,则看起来Contains仅返回true.有没有办法指定所有列都应包含在AND中?
如果没有,我的想法是JSON所有搜索列并将它们合并为一个.这样我就可以全文搜索它们,但仍然可以轻松地在.NET中提取单个列.我假设索引器不会出现问题,并且会省去JSON字符和引号.它是否正确?
谢谢
编辑
考虑到JSON的想法,抓取工具还会为属性名称编制索引,因此我必须将{name},{details},{long_details}重命名为{x1},{x2},{x3}以确保它们' d不在搜索中挑选.希望如果他们这么短,他们就不会被编入索引.
EDIT2
我可以根据系统Stoplist 创建一个Stoplist,并将属性名称放入其中.
在过去的4天里,我的夜间更新出现了大量问题,除了1晚之外,这4天之间一切都很顺利.
在这些更新期间,我更新了几个全文索引.我是这样做的.
- 删除全文索引
- 更新全文表
- 添加全文索引
这已经超过2年完美.通常的更新时间约为3-4小时,这对于每晚更新的数据量是正常的.但自周五以来,更新时间确实在9-12小时之间!
昨晚服务器故意被引擎崩溃,这是在错误日志中
InnoDB:警告:一个长信号量等待: - 线程8676已经在dict0boot.ic第36行等待241.00秒信号量:Mutex在0000000053B0C1E8创建文件dict0dict.cc第887行,lock var 1 waiters flag 1 InnoDB:#### ##启动InnoDB Monitor 30秒打印诊断信息:InnoDB:待处理的preads 0,pwrites 0
InnoDB:######诊断信息打印到标准错误流InnoDB:错误:信号量等待持续> 600秒InnoDB:我们故意使服务器崩溃,因为它似乎挂起了.2014-07-21 05:20:54 1384 InnoDB:文件srv0srv.cc第1748行中的线程4996中的断言失败
InnoDB:我们故意生成一个内存陷阱.InnoDB:向http://bugs.mysql.com提交详细的错误报告.InnoDB:如果你重复断言失败或崩溃,即使是InnoDB:在mysqld启动之后,可能会有InnoDB:InnoDB表空间中的损坏.请参考InnoDB:http: //dev.mysql.com/doc/refman/5.6/en/forcing-innodb-recovery.html InnoDB:关于强制恢复.
我刚刚重新启动服务器,它很好,所以我现在等待在bugs.mysql.com发布完整的错误报告
我在这个页面上发现了一些东西,它似乎是同一类问题,但没有进一步的消息.
我不知道从哪里开始,我不知道为什么会突然发生这种情况.
我必须从这里提供什么样的细节?
编辑
看完这个,它指出
"MySQL 5.6及更高版本中的体系结构更改使得更多工作负载适合于禁用自适应哈希索引,而不是早期版本,尽管默认情况下仍然启用它."
我已经禁用了自适应哈希索引
SET GLOBAL innodb_adaptive_hash_index=0
,我现在正在尝试第一次尝试查看问题是否已修复.情况就像晚上一样.
夜间更新:
更新很顺利.不到6个小时.全文索引更新没有问题,但我仍然发现简单的更新查询JOIN速度很慢.(以8秒为单位的40000条记录,通常在不到的时间内完成1). …
需要重建mssql全文索引.
问题是 - 我需要确切知道什么时候完成工作.因此 - 只需致电:
ALTER FULLTEXT CATALOG fooCatalog
REBUILD WITH ACCENT_SENSITIVITY = OFF
Run Code Online (Sandbox Code Playgroud)
不起作用或我做了一些稍微错误的事情.:/
有任何想法吗?
我非常清楚如何使用MySQL实现全文搜索.我知道如何添加索引并进行查询和排序结果.
但我一直试图获得更多有关其工作方式的信息,以便说明幕后发生的事情.MySQL如何确定结果相关性.分数甚至意味着什么?哪个可以达到0.1到超过4.6(我至少看过,可能更多)以及真正被索引的是什么?
输入的搜索字符串会发生什么变化?
我很感谢这里的链接或解释!
首先,我应该指出我对SQL Server索引知之甚少.
我的情况是我有一个SQL Server 2008数据库表,其中varchar(max)列通常填充了大量文本.
我的ASP.NET Web应用程序有一个搜索工具,可以在此列中查询关键字搜索,并且根据搜索的关键字数量,可能是SQL查询中的一个或多个LIKE'%keyword%'语句来进行搜索.
我的Web应用程序也允许通过此表中的各个其他列进行搜索,而不仅仅是一列.其他表也有一些连接.
我的问题是,是否值得在此列上创建索引以提高这些搜索查询的性能?如果是这样,什么类型的索引,只是索引一列是足够的,还是我需要包括其他列,如主键和其他可搜索的列?
sql-server indexing full-text-indexing sql-server-2008 database-optimization
TLDR; 如何使用Entity framework 5编码迁移添加全文索引
我在使用Entity框架迁移向数据库添加全文索引时遇到问题.它需要从一开始就在那里,所以我正在尝试修改自动生成的InitialCreate迁移以添加它.
由于没有办法通过DbMigrations API来实现,我使用了在'Up'代码末尾运行内联sql.
Sql("create fulltext catalog AppNameCatalog;");
Sql("create fulltext index on Document (Data type column Extension) key index [PK_dbo.Document] on AppNameCatalog;");
Run Code Online (Sandbox Code Playgroud)
当这个运行时,一切都被创建好,直到它到达这个sql,然后它抛出sql错误' CREATE FULLTEXT CATALOG语句不能在用户事务中使用.".这是预期的,并按设计工作.
值得庆幸的是,Sql()有一个重载,允许您在迁移事务之外运行sql.真棒!我想.
Sql("create fulltext catalog AppNameCatalog;", true);
Sql("create fulltext index on Document (Data type column Extension) key index [PK_dbo.Document] on AppNameCatalog;", true);
Run Code Online (Sandbox Code Playgroud)
但是低并且看到修改代码来执行此操作(参见上文)会导致新的超时错误' 超时已到期.操作完成之前经过的超时时间或服务器没有响应."
我已经尝试吐出sql并手动运行它,它工作正常.我也在生成的sql中使用和不在事务外运行它们并且它们是相同的,因此它必须是sql执行方式.
在此先感谢您的帮助!
我们使用Oracle Text CTXSYS.CONTEXT索引来索引包含元信息的大约50万行.信息分布在两个表中,这两个表由索引器在运行时调用的过程(功能索引)组合在一起.
当我在本地机器(简单的双核笔记本)上运行CREATE INDEX时,索引在大约3分钟内构建.在我们的数据库服务器上运行在具有8个内核和16G内存的Solaris上,需要24小时才能为相同(完全相同)的数据创建索引.
示例代码: 这是两个表和3列的索引进纸器:
create or replace procedure docmeta_revisions_text_feeder
( p_rowid in rowid , p_clob in out nocopy clob) as v_clob CLOB begin
FOR c1 IN (select DM.DID, DM.XDESCRIB || ' ' || DM.XAUTHOR AS data
from DOCMETA DM
WHERE ROWID = p_rowid)
LOOP
v_clob := v_clob || c1.data;
FOR c2 IN (
SELECT ' ' || RV.DDOCTITLE AS data
FROM REVISIONS RV
WHERE RV.DID = c1.DID)
LOOP
v_clob := v_clob || c2.data;
END LOOP;
END LOOP; …Run Code Online (Sandbox Code Playgroud) 我创建了一个Oracle Text索引,如下所示:
create index my_idx on my_table (text) indextype is ctxsys.context;
Run Code Online (Sandbox Code Playgroud)
然后我可以做以下事情:
select * from my_table where contains(text, '%blah%') > 0;
Run Code Online (Sandbox Code Playgroud)
但是,假设我们在此表中有另一列,比如说group_id,我想要执行以下查询:
select * from my_table where contains(text, '%blah%') > 0 and group_id = 43;
Run Code Online (Sandbox Code Playgroud)
使用上面的索引,Oracle将不得不搜索包含的所有项目,'blah'然后检查它们group_id的所有内容.
理想情况下,我更喜欢只搜索项目group_id = 43,所以我想要一个像这样的索引:
create index my_idx on my_table (group_id, text) indextype is ctxsys.context;
Run Code Online (Sandbox Code Playgroud)
有点像普通索引,因此可以为每个索引进行单独的文本搜索group_id.
有没有办法在Oracle中做这样的事情(如果这很重要,我使用的是10g)?
编辑(澄清)
考虑一个包含一百万行的表和以下两列,A以及B两个数字.假设有500个不同的值A和2000个不同的值B,每行都是唯一的.
现在我们考虑一下 select ... where A = x and B …
存储和搜索的内部包含哪些内容?如同细节一样?
例如,我有一百万个文档与一个术语匹配,一百万个其他文档与一个AND查询的第二个术语相匹配.lucene如何快速地为我提供顶级k?
它是否按照每个术语增加doc IDS的顺序存储文档?然后,当两个术语的文档必须相交时,它通过在一次传递中递增地迭代它们来查找两个集合中的第一个共同k个文档.
或者,它是否使用较大的文档数组中的简单无序哈希集来查找公共文档?
或者是否使用这种(或可能更多)类型的交叉点策略取决于用户提出的文档数量,与个别术语匹配的那些因素以及其他因素?
任何可以指出文档数组合并的细节的文章将不胜感激.
编辑:感谢信息人员.现在有道理.跳过列表可以发挥魔力.我将深入挖掘它以获得清晰的理解.
我有一个简单的查询依赖于两个全文索引表,但是当我将CONTAINS与任何其他OR搜索结合使用时,它运行得非常慢.正如执行计划中所见,这两个全文搜索会破坏性能.如果我仅使用CONTAINS中的一个查询,或者两者都不查询,则查询是亚秒级的,但是当您将OR添加到混合中时,查询就会变得不合适.
这两张表没有什么特别之处,它们不是太宽(一个是42个,另一个是21个;可能每个10个列都是FT索引),甚至包含很多记录(两个中最大的36个记录).
我能够通过将两个CONTAINS搜索分成他们自己的SELECT查询来解决性能,然后将这三个UNION一起解决.UNION的解决方案是我唯一的希望吗?
谢谢.
SELECT a.CollectionID
FROM collections a
INNER JOIN determinations b ON a.CollectionID = b.CollectionID
WHERE a.CollrTeam_Text LIKE '%fa%'
OR CONTAINS(a.*, '"*fa*"')
OR CONTAINS(b.*, '"*fa*"')
Run Code Online (Sandbox Code Playgroud)
执行计划(我想在发布图片之前需要更多声誉):http: //yfrog.com/7dslowcontainsj http://desmond.yfrog.com/Himg265/scaled.php?tn=0&server=265&filename=slowcontains.jpg&xsize = 640&YSIZE = 640
sql-server full-text-search full-text-indexing sql-server-2008
sql-server ×3
indexing ×2
mysql ×2
oracle ×2
sql ×2
alter-table ×1
innodb ×1
lucene ×1
oracle-text ×1
search ×1
t-sql ×1