gpt4 book ai didi

ruby-on-rails - 使用 pg_search 匹配特殊字符(例如#、+)

转载 作者:数据小太阳 更新时间:2023-10-29 07:18:31 26 4
gpt4 key购买 nike

我在 Rails 应用程序中使用 pg_search gem 来搜索用户 - 他们的简历和相关技能模型。用户是开发人员,所以他们的技能包括“CSS”、“C++”、“C#”、“Objective C”等...

我最初使用以下搜索范围:

pg_search_scope :search,
against: [:bio],
using: {tsearch: {dictionary: "english", prefix: true}},
associated_against: {user: [:fname, :lname], skills: :name}

但是,如果您在这种情况下搜索“C++”,您会得到包含“CSS”(以及其他内容)的结果。我更改了范围以使用“简单”字典并删除了前缀:

pg_search_scope :search_without_prefix,
against: [:bio],
using: {tsearch: {dictionary: "simple"}},
associated_against: {user: [:fname, :lname], skills: :name}

这修复了一些问题——例如,搜索“C++”不会显示“CSS”。但是,搜索“C++”或“C#”仍然匹配列出了“C”或“Objective C”的用户

我绝对可以进行基本的 ILIKE 匹配,但希望尽可能使用 pg_search 来完成。

最佳答案

我会发表评论,但我还没有足够的声誉。

我一直在研究 pg_search,这让我更深入地了解 PostgreSQL 全文搜索。这是一个复杂的模块,但它有 ts_debug() 命令来帮助理解输入字符串的解析方式。测试字符串“C++ CSS C# Objective C”的 ts_debug() 输出非常有启发性。看起来“# 和”+“在英语的默认配置中被视为空格。我认为您可能必须修改 PostgreSQL 中的解析器才能获得您想要的行为。

postgres=# SELECT * FROM ts_debug('english', 'C++ CSS C# Objective C');
alias | description | token | dictionaries | dictionary | lexemes
-----------+-----------------+-----------+----------------+--------------+----------
asciiword | Word, all ASCII | C | {english_stem} | english_stem | {c}
blank | Space symbols | + | {} | |
blank | Space symbols | + | {} | |
asciiword | Word, all ASCII | CSS | {english_stem} | english_stem | {css}
blank | Space symbols | | {} | |
asciiword | Word, all ASCII | C | {english_stem} | english_stem | {c}
blank | Space symbols | # | {} | |
asciiword | Word, all ASCII | Objective | {english_stem} | english_stem | {object}
blank | Space symbols | | {} | |
asciiword | Word, all ASCII | C | {english_stem} | english_stem | {c}
(10 rows)

顺便说一句,如果你想学习 PostgreSQL 全文搜索,这里有一个非常有用的教程:http://shisaa.jp/postset/postgresql-full-text-search-part-1.html

更新:

我在 PostgreSQL 全文搜索中找到了一个解决方案。它涉及使用此处记录的 test_parser 扩展:http://www.postgresql.org/docs/9.1/static/test-parser.html

首先需要在psql中进行一些配置:

postgres=# CREATE EXTENSION test_parser;

postgres=# CREATE TEXT SEARCH CONFIGURATION testcfg ( PARSER = testparser );

postgres=# ALTER TEXT SEARCH CONFIGURATION testcfg
ADD MAPPING FOR word WITH english_stem;

现在您可以索引一个测试字符串,并看到像“C++”这样的术语被视为单独的标记,如您所愿:

postgres=# SELECT to_tsvector('testcfg', 'C++ CSS C# Objective C #GT40 GT40 added joined');
to_tsvector
----------------------------------------------------------------------------
'#gt40':6 'ad':8 'c':5 'c#':3 'c++':1 'css':2 'gt40':7 'join':9 'object':4
(1 row)

问题仍然是如何将它集成到 pg_search 中。我正在看接下来。

关于ruby-on-rails - 使用 pg_search 匹配特殊字符(例如#、+),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19391356/

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