gpt4 book ai didi

php - 使用 PostgreSQL 进行全文搜索和模糊搜索

转载 作者:行者123 更新时间:2023-11-29 12:37:38 24 4
gpt4 key购买 nike

如果这是一个愚蠢的问题,请原谅我。

我的一个迁移中有以下代码:

    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, ' ', '')) ||

我知道这很丑陋,但我主要做的是确保如果有人搜索例如“BurgerKing”,我想返回“Burger King”的结果。我知道这看起来像一个愚蠢的例子,但这些错误在瑞典语中经常发生(不一定是汉堡王,而是其他术语)。除此之外,我还想确保当有人打错字时我仍然想返回相关结果。

所以,我的问题是。我该如何实现?我尝试使用模糊搜索,但有点卡住了,因为我不知道如何查询由 tsvector 值组成的列(文档)。

最佳答案

Full Text Search适用于词典和词干提取,不适用于模糊搜索和一般模式匹配。
考虑附加模块 pg_trgm为了那个原因。它的运算符类允许支持 LIKE 和相关模式匹配运算符的 GIN 或 GiST 索引。

此相关答案中的详细信息:
PostgreSQL LIKE query performance variations

Postgres 模式匹配技术概述:
Pattern matching with LIKE, SIMILAR TO or regular expressions in PostgreSQL

关于php - 使用 PostgreSQL 进行全文搜索和模糊搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24575952/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com