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

ee7vknir  于 2023-08-02  发布在  PHP
关注(0)|答案(2)|浏览(143)

原谅我,如果这是一个愚蠢的问题。
在我的一个迁移中有以下代码:

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值组成的列(文档)。

ulmd4ohb

ulmd4ohb1#

Full Text Search可与字典和词干匹配一起使用,但未针对模糊搜索和一般模式匹配进行优化。
考虑额外的模块pg_trgm。它的操作符类允许支持LIKE和相关模式匹配操作符的GIN或GiST索引。
请参阅:

bq9c1y66

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

相关问题