我有一个带有邮政编码的字符串NN2 7DG
。SQL Server 可以完美找到7DG
但不能NN2
。
我的停用词列表是空的。
我查看了索引关键字,NN2
甚至不存在,7DG
而是
-- list indexed keywords
SELECT * FROM sys.dm_fts_index_keywords (DB_ID('MyDatabase'), OBJECT_ID('MyTable'))
建议?
我有一个带有邮政编码的字符串NN2 7DG
。SQL Server 可以完美找到7DG
但不能NN2
。
我的停用词列表是空的。
我查看了索引关键字,NN2
甚至不存在,7DG
而是
-- list indexed keywords
SELECT * FROM sys.dm_fts_index_keywords (DB_ID('MyDatabase'), OBJECT_ID('MyTable'))
建议?
我有一个“标题”列的记录,我按空格分割并用每个单词执行全文搜索。我将结果存储在物化视图中。
这行得通,但是我得到了各种单词的重复结果,我需要按它们的排名对结果进行排序。我可以做一个或另一个 - 不能两者兼而有之。我该怎么做?
我的查询:
SELECT
asset.id,
(
select
jsonb_agg(resultsForWord)
FROM
UNNEST(
string_to_array(TRIM(regexp_replace(asset.title, '[^a-zA-Z+]', ' ', 'g')), ' ')
) as word
INNER JOIN LATERAL
(
SELECT
searchresult.id,
searchresult.title,
ts_rank(ts, to_tsquery ('english', word)) rank
FROM
assets searchresult
WHERE
searchresult.id != asset.id AND
ts_rank(ts, to_tsquery ('english', word)) > 0.5
LIMIT 5
) AS resultsForWord ON 1=1
) results
FROM
assets asset
WHERE asset.id = 'abc'
GROUP BY asset.id;
为了过滤掉我刚刚做的重复
jsonb_agg(DISTINCT resultsForWord)
按等级排序,我刚刚做了
jsonb_agg(resultsForWord ORDER BY rank DESC)
当我两者都做时,我得到:
ERROR: in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list
示例数据:
CREATE TABLE assets (
id TEXT PRIMARY KEY,
title TEXT,
ts tsvector
GENERATED ALWAYS AS (setweight(to_tsvector('english', coalesce(title, '')), 'A')) STORED
)
INSERT INTO assets (id, title) VALUES ('a', 'Hello world!'),
('b', 'Hello sir'),
('c', 'I am above the world'),
('d', 'World hello')
我使用的是sql server 2019,我根据微软的例子创建了全文索引,但是有一个问题,在文本中搜索部分单词时,没有结果
sql服务器版本:
Microsoft SQL Server 2019 (RTM-CU13) (KB5005679) - 15.0.4178.1 (X64)
Sep 23 2021 16:47:49
Copyright (C) 2019 Microsoft Corporation
Enterprise Edition (64-bit) on Windows Server 2019 Datacenter 10.0 <X64> (Build 17763: ) (Hypervisor)
例如 :
CREATE TABLE Flags (Country nvarchar(30) NOT NULL, FlagColors varchar(200));
CREATE UNIQUE CLUSTERED INDEX FlagKey ON Flags(Country);
INSERT Flags VALUES ('France', 'Blue and White and Red');
INSERT Flags VALUES ('Italy', 'Green and White and Red');
INSERT Flags VALUES ('Tanzania', 'Green and Yellow and Black and Yellow and Blue');
SELECT * FROM Flags;
GO
CREATE FULLTEXT CATALOG TestFTCat;
CREATE FULLTEXT INDEX ON Flags(FlagColors) KEY INDEX FlagKey ON TestFTCat;
GO
现在我搜索这个词blu
,但尽管这个词没有结果blue
(我需要一个模糊搜索)
像这样的查询:
SELECT * FROM FREETEXTTABLE (Flags, FlagColors, 'Blu');
是什么原因?
试图弄清楚为什么下面的查询没有返回任何结果:
select id from story where tsv_story_text @@ to_tsquery('CumEx-Files<->2.0');
该术语存在于数据库(PostgreSQL 11.12)中一个故事的标题中,例如:
CumEx-Files 2.0 investigation reveals €150bn tax fraud
我可以让查询工作的唯一方法是在向量和有效的查询中用破折号替换连字符,所以我尝试调试这个短语,但似乎连字符只是一个空格符号 - 我认为它必须对短语中的数字做些什么,或者是吗?
SELECT * FROM ts_debug('english', 'CumEx-Files<->2.0');
alias | description | token | dictionaries | dictionary | lexemes
-----------------+---------------------------------+-------------+----------------+--------------+-------------
asciihword | Hyphenated word, all ASCII | CumEx-Files | {english_stem} | english_stem | {cumex-fil}
hword_asciipart | Hyphenated word part, all ASCII | CumEx | {english_stem} | english_stem | {cumex}
blank | Space symbols | - | {} | |
hword_asciipart | Hyphenated word part, all ASCII | Files | {english_stem} | english_stem | {file}
blank | Space symbols | < | {} | |
blank | Space symbols | -> | {} | |
float | Decimal notation | 2.0 | {simple} | simple | {2.0}
在运行其中包含布尔全文搜索的查询时,我遇到了间歇性的 oom 错误。
我在 AWS Aurora (t2.medium) 上。
这是一个示例查询,考虑到表“sets”在列(savename、title)上有一个全文索引,并且其中有大约 200 万行。
select sets.id, sets.title,
drafts.draftId as draftId,
folderSets.folderId as folderId,
concat_ws(' ', savedBy.firstname, savedBy.lastname) as savedBy,
match(sets.savename, sets.title) against ("+s*" in boolean mode) as relevance
from sets as sets
join folderSets as folderSets on folderSets.setId = sets.id
join folders as folders on folders.id = folderSets.folderId
left join draftSets as drafts on drafts.originalId = sets.id and drafts.userId = ?
left join users as savedBy on savedBy.id = folderSets.userId
where (folders.userId = ?)
and match(sets.savename, sets.title) against ("+s*" in boolean mode)
order by relevance
limit 0, 25;
此查询大约需要 5 秒才能运行。如果我敲了几次,查询很可能会失败并出现 OOM。
如果我将布尔全文搜索短语从“+s*”更改为“+sam*”——因此通配符之前有更多字符——相同的查询在大约 0.15 秒内执行,没有任何问题。
如果我从查询中删除布尔搜索 altogehter,查询运行得更快,没有任何问题。
因此,查询的布尔全文部分似乎发生了一些事情,达到了 mysql 限制。
以下是 innodb 全文系统变量:
ft_boolean_syntax................... + -><()~*:""&|
ft_max_word_len..................... 84
ft_min_word_len..................... 1
ft_query_expansion_limit............ 20
ft_stopword_file.................... /dev/null
innodb_ft_aux_table.................
innodb_ft_cache_size................ 8000000
innodb_ft_enable_diag_print......... OFF
innodb_ft_enable_stopword........... OFF
innodb_ft_max_token_size............ 84
innodb_ft_min_token_size............ 1
innodb_ft_num_word_optimize......... 2000
innodb_ft_result_cache_limit........ 2000000000
innodb_ft_server_stopword_table.....
innodb_ft_sort_pll_degree........... 2
innodb_ft_total_cache_size.......... 640000000
innodb_ft_user_stopword_table.......
有没有人对可以进行任何调整以减少与布尔全文相关的 OOM 的可能性有任何建议?我不清楚这是可以/应该在 sql 查询级别/mysql innodb 设置级别/或者如果我处于需要增加 aws rds 实例大小的情况。
在此先感谢您的帮助!
我正在使用以下文本搜索配置:
CREATE TEXT SEARCH DICTIONARY tsd
(TEMPLATE = pg_catalog.SIMPLE);
CREATE TEXT SEARCH CONFIGURATION tsc_test
(COPY = german);
ALTER TEXT SEARCH CONFIGURATION tsc_test
ALTER MAPPING FOR asciihword, asciiword, hword, hword_asciipart, hword_part, word
WITH tsd;
我正在尝试对表格执行全文搜索,但我无法弄清楚如何正确定义文本搜索配置。我的问题是
SELECT to_tsvector('tsc_test', 'foo bar');
和
SELECT to_tsvector('tsc_test', 'foo_bar');
产生相同的tsvector
对象,因为_
(和其他,如#(){}
等)被解释为空格符号(请参阅SELECT ts_debug ('tsc_test', 'foo_bar');
)。然而,我需要它们是不同的。
有没有办法调整我的文本搜索配置,使其仅将空格
视为单词分隔符而不是其他任何东西?
我希望将 tsvector 数组的词位放在一列中,每行一个。我可以首先取消嵌套数组,然后使用以下命令生成 tsvector:
SELECT (unnest(unnest(my_array))).lexeme
FROM my_table
WHERE id = 1;
这使:
lexeme
----------
foo
bar
baz
...
但是,我注意到,如果我尝试在 FROM 子句中做同样的事情:
SELECT lexeme
FROM unnest(
(SELECT unnest(my_array) FROM my_table WHERE id = 1)
);
我得到:
错误:用作表达式的子查询返回多行
所以,我最终这样做:
SELECT lexeme
FROM (
SELECT (unnest(col1)).lexeme
FROM (
SELECT unnest(my_array)
FROM my_table
WHERE id = 1
) AS t(col1)
) AS t2;
我得到了原始结果。但这很冗长。所以,我想知道:
为什么 unnest() 在 FROM 子句中需要单个输入行,但在 SELECT 子句中不需要?
有没有比我的代码更简洁、不那么复杂的方式来获取 FROM 子句中的词位列?
SELECT 子句中的取消嵌套与 FROM 子句中的取消嵌套在性能上是否存在差异?
我在我的应用程序中加入了用户可访问的 Oracle-Text 功能,我注意到逗号,
可以用来代替OR
管道|
字符。
搜索“red OR green OR blue”会返回与“red|green|blue”或“red,green,blue”相同的结果。
我查看了Oracle-Text Contains文档并尝试了我最喜欢的搜索引擎,但我没有找到任何文档来支持或否定我的发现,并且,
从未提及逗号。
我想提到逗号,
作为我的用户的一个选项,但我不想没有一些支持文档。
以下产量(似乎完全正确)0.1
:
select ts_rank_cd(to_tsvector('cat'), to_tsquery('cat'));
然而,以下产量t
:
select ts_rank_cd(to_tsvector('cat'), to_tsquery('cat')) > 0.1;
t
如果操作是,我希望它会产生>=
,而不是>
如何获得它的“真实”值ts_rank_cd
以便它返回f
?
作为背景,我正在编写一个使用键集分页的全文搜索查询ts_rank
,因此能够根据具体、精确的值对结果进行排序ts_rank
很重要。使用键集分页,客户端提供当前页面的最后一个结果作为参数并请求下一页。目前,当我的客户传回0.1
时,上述>
行为会导致错误的结果
select to_tsvector('english_nostop', 'u,s') @@ to_tsquery('english_nostop', 'u<->s');
返回t
,而
select to_tsvector('english_nostop', 'u.s') @@ to_tsquery('english_nostop', 'u<->s');
返回f
用这个调试:
SELECT alias, token, lexemes FROM ts_debug('english_nostop', 'u.s');
alias | token | lexemes
-------+-------+---------
file | u.s | {u.s}
和
audiobook=> SELECT alias, token, lexemes FROM ts_debug('english_nostop', 'u,s');
alias | token | lexemes
-----------+-------+---------
asciiword | u | {u}
blank | , |
asciiword | s | {s}
怎样才能消除这种行为。做.
喜欢,
?别名file
似乎认为u.s
是特殊的。
这是我的配置:
CREATE TEXT SEARCH DICTIONARY english_stem_nostop (
Template = snowball
, Language = english
);
CREATE TEXT SEARCH CONFIGURATION public.english_nostop ( COPY = pg_catalog.english );
ALTER TEXT SEARCH CONFIGURATION public.english_nostop
ALTER MAPPING FOR asciiword, asciihword, hword_asciipart, hword, hword_part, word WITH english_stem_nostop;
ALTER TEXT SEARCH CONFIGURATION public.english_nostop DROP MAPPING FOR asciihword, hword;
而且我们不能简单地删除file
,这将删除全部文本:
ALTER TEXT SEARCH CONFIGURATION public.english_nostop DROP MAPPING FOR file;
SELECT alias, token, lexemes FROM ts_debug('english_nostop', 'u.s');
alias | token | lexemes
-------+-------+---------
file | u.s |
这也是错误的。如果我们ALTER MAPPING for file
,我们得到
SELECT alias, token, lexemes FROM ts_debug('english_nostop', 'u.s');
alias | token | lexemes
-------+-------+---------
file | u.s | {u.}
仍然不是我的目的。