原谅我,如果这是一个愚蠢的问题。
在我的一个迁移中有以下代码:
DB::statement("
CREATE MATERIALIZED VIEW searchable_stores AS
SELECT
chain_stores.id as chain_store_id,
local_chain_stores.id as local_chain_store_id,
chain_stores.website as website,
chain_stores.name as name,
chain_stores.cname as cname,
chain_stores.flyer_url as flyer_url,
local_chain_stores.city as city,
local_chain_stores.shopping_mall as shopping_mall,
local_chain_stores.postal_code as postal_code,
local_chain_stores.street_address as street_address,
to_tsvector('sv', chain_stores.name) ||
to_tsvector('sv', replace(chain_stores.name, ' ', '')) ||
to_tsvector('sv', local_chain_stores.city) ||
to_tsvector('simple', to_char(local_chain_stores.postal_code, '99999')) ||
to_tsvector('sv', coalesce(local_chain_stores.shopping_mall)) ||
to_tsvector('sv', local_chain_stores.street_address) ||
to_tsvector('sv', chain_stores.bio)
as document
FROM
local_chain_stores, chain_stores
WHERE
local_chain_stores.chain_store_id = chain_stores.id
");
字符串
这就是我如何查询表:
$results = SearchableStore::
whereRaw("document @@ plainto_tsquery('simple', ?)", array($searchQuery->getQuery()))
->orWhereRaw("document @@ plainto_tsquery('sv', ?)", array($searchQuery->getQuery()))
->orderBy('name', 'asc')
->get();
return $results;
型
这很好用,除非有人拼错了一些单词。这就是我想解决的问题你也会注意到这两行:
to_tsvector('sv', chain_stores.name) ||
to_tsvector('sv', replace(chain_stores.name, ' ', '')) ||
型
我知道这是丑陋的,但我基本上是做的是确保如果有人做了一个搜索,例如“汉堡王”,我想返回的结果为“汉堡王”。我知道这看起来像一个愚蠢的例子,但这些错误在瑞典语中经常发生(不一定是汉堡王,但其他术语)。除此之外,我还想确保当有人输入错误时,我仍然希望返回相关的结果。
所以我的问题是我该如何实现这一点?我尝试过使用模糊搜索,但我有点卡住了,因为我不知道如何查询由tsvector值组成的列(文档)。
2条答案
按热度按时间ulmd4ohb1#
Full Text Search可与字典和词干匹配一起使用,但未针对模糊搜索和一般模式匹配进行优化。
考虑额外的模块pg_trgm。它的操作符类允许支持
LIKE
和相关模式匹配操作符的GIN或GiST索引。请参阅:
bq9c1y662#
你要找的是同义词和同义词库词典,这是一个很大的工作来编译它们,但这将使您的搜索方式更具成本效益的CPU和磁盘使用方面。
对于某些语言,您可以找到同义词库词典,这些词典可以在OpenOffice中轻松转换,以便您自己转换其他语言。我仍然在寻找好的来源,并在这里发布了一个关于这个主题的问题:https://dba.stackexchange.com/questions/80632/where-to-download-dutch-postgresql-fulltext-search-dictionaries,目前还没有答案。
如果你运行的是Linux,那么安装你的语言的myspell或hunspell包也是值得的。有关这些软件包的安装信息,请参阅:https://askubuntu.com/questions/72099/how-to-install-a-libreoffice-dictionary-spelling-check-thesaurus的
如果你想知道如何在PostgreSQL中使用它们,你应该仔细阅读配置全文搜索,我真的很喜欢这个家伙,因为这里写的是一个轻松易懂的方式:a full text search engine的