Postgresql 中的 Postgresql 全文搜索 - 日语、中文、阿拉伯语

问题描述 投票:0回答:4

我正在为我当前的项目在 postgresql 中设计一个全文搜索功能。 到目前为止,它可以与 ispell/myspell 词典一起使用。 现在我需要添加对中文、日文和阿拉伯文搜索的支持。 我从哪说起呢? 没有适用于这些语言的模板或词典 据我所知。 它可以与 pg_catalog.simple 配置一起使用吗?

postgresql unicode internationalization full-text-search
4个回答
4
投票

只是 manual 的提示:OpenOffice Wiki 上提供了大量词典。


3
投票

字典对中文帮助不大——你需要查看 NGRAM 标记化……


2
投票

stackoverflow.com 链接的类似解决方案是How do I implement full text search in Chinese on PostgreSQL? .

尽管如此,我会根据我的经验和互联网上的解决方案在下面提供详细的解决方案。我使用SCWSzhparser这两个工具作为postgres中文全文搜索的解决方案。

20160131更新:
您必须检查您是否安装了 postgresql-server-devel-{number version} 因为我们将使用它的 pgxs 函数在 postgresql 中创建扩展。

Step1:安装SCWS。
值得注意的是 --prefix=/usr/local/scws 跟随 ./configure 。不仅在第 4 行以下有 ./configure。

wget http://www.xunsearch.com/scws/down/scws-1.2.2.tar.bz2
tar xvjf scws-1.2.2.tar.bz2
cd scws-1.2.2
./configure --prefix=/usr/local/scws 
make
make install

查看是否安装成功,请输入以下命令:

ls -al /usr/local/scws/lib/libscws.la


Step2:安装zhparser

git clone https://github.com/amutu/zhparser.git
cd zhparser
SCWS_HOME=/usr/local/scws/include make && make install

20160131更新: 如果您使用 Mac OS X Yosemite,上述 SCWS_HOME 的值是相同的。但是,如果您使用 Ubuntu 14.04 LTS,请将 SCWS_HOME 的值更改为 /usr/local/scws

Step3: 在 Postres 中使用 zhparser 配置一个新的扩展
Step3.1: 通过终端/命令行登录你的postgres数据库

psql yourdatabasename

Step3.2: 在 Postgres 中创建扩展。你可以指定你想要的字典名称。

CREATE EXTENSION zhparser;
CREATE TEXT SEARCH CONFIGURATION dictionarynameyouwant (PARSER = zhparser);
ALTER TEXT SEARCH CONFIGURATION dictionarynameyouwant ADD MAPPING FOR n,v,a,i,e,l WITH simple;


如果您按照以上步骤操作,您就可以使用 Postgres 的中文/普通话全文搜索功能。

在 Rails 中使用 pg_search gem 的额外步骤(不是必需的):Step4。在

app/models/yourmodel.rb

中的:tsearch的:dictionary属性处配置字典名称
class YourOwnClass < ActiveRecord::Base
    ...
    include PgSearch
    pg_search_scope :functionnameyoulike, :against => [columnsyoulike1, columnsyoulike2, ...,etc], :using => { :tsearch => {:dictionary => "dictionary name you just specified in creating a extension in postgres", blah blah blah, ..., etc} }
end

参考:
1. SCWS安装教程
2. [email protected]
3. Francs' Post - 使用 zhparser 和 SCWS 进行 Postgres 全文搜索
4. Rails365.net's Post - Postgres 全文搜索中文 pg_search gem with zhparser
5. 我在 xuite.net 的帖子 - 让 Postgres 支持普通话/中文全文搜索


0
投票

对于那些登陆这里进行日文 PostgreSQL 全文搜索的人,这是在 ubuntu 上进行的方法:

安装以下软件和开发环境:

apt-get install libmecab-dev libmecab2 mecab-ipadic-utf8 mecab-utils libmecab-perl libtext-mecab-perl mecab mecab-jumandic-utf8

https://www.postgresql.org/ftp/projects/pgFoundry/textsearch-ja/textsearch_ja/9.0.0/

下载 textsearch_ja

以下内容适用于使用 PostgreSQL 12 版的用户:

cd textsearch_ja-9.0.0
make USE_PGXS=1 PG_CONFIG=/usr/lib/postgresql/12/bin/pg_config
sudo make USE_PGXS=1 PG_CONFIG=/usr/lib/postgresql/12/bin/pg_config install

这将产生类似的东西:

/bin/mkdir -p '/usr/lib/postgresql/12/lib'
/bin/mkdir -p '/usr/share/postgresql/12/contrib'
/usr/bin/install -c -m 755  textsearch_ja.so '/usr/lib/postgresql/12/lib/textsearch_ja.so'
/usr/bin/install -c -m 644 .//uninstall_textsearch_ja.sql textsearch_ja.sql '/usr/share/postgresql/12/contrib/'
/bin/mkdir -p '/usr/lib/postgresql/12/lib/bitcode/textsearch_ja'
/bin/mkdir -p '/usr/lib/postgresql/12/lib/bitcode'/textsearch_ja/ '/usr/lib/postgresql/12/lib/bitcode'/textsearch_ja/pgut/
/usr/bin/install -c -m 644 textsearch_ja.bc '/usr/lib/postgresql/12/lib/bitcode'/textsearch_ja/./
/usr/bin/install -c -m 644 encoding_eucjp.bc '/usr/lib/postgresql/12/lib/bitcode'/textsearch_ja/./
/usr/bin/install -c -m 644 encoding_utf8.bc '/usr/lib/postgresql/12/lib/bitcode'/textsearch_ja/./
/usr/bin/install -c -m 644 pgut/pgut-be.bc '/usr/lib/postgresql/12/lib/bitcode'/textsearch_ja/pgut/
cd '/usr/lib/postgresql/12/lib/bitcode' && /usr/lib/llvm-10/bin/llvm-lto -thinlto -thinlto-action=thinlink -o textsearch_ja.index.bc textsearch_ja/textsearch_ja.bc textsearch_ja/encoding_eucjp.bc textsearch_ja/encoding_utf8.bc textsearch_ja/pgut/pgut-be.bc

然后,在自动生成的textsearch_ja.sql中,将

LANGUAGE='C'
改为
LANGUAGE='c'
(小写):

perl -pi -E "s/LANGUAGE 'C'/LANGUAGE 'c'/" textsearch_ja.sql

然后,您可以使用超级用户将其添加到 PostgreSQL 中:

sudo -u postgres psql -f textsearch_ja.sql

如果您想为现有数据库添加它:

sudo -u postgres psql -d my_database -f textsearch_ja.sql

这将产生类似的东西:

SET
BEGIN
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE TEXT SEARCH PARSER
COMMENT
CREATE FUNCTION
CREATE TEXT SEARCH TEMPLATE
CREATE TEXT SEARCH DICTIONARY
CREATE TEXT SEARCH CONFIGURATION
COMMENT
ALTER TEXT SEARCH CONFIGURATION
ALTER TEXT SEARCH CONFIGURATION
ALTER TEXT SEARCH CONFIGURATION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
COMMIT

根据https://github.com/HiraokaHyperTools/textsearch_ja

进行测试
SELECT ja_wakachi('分かち書きを行います。');

会产生:

         ja_wakachi
----------------------------
 分かち書き を 行い ます 。
(1 row)
SELECT furigana('漢字の読みをカタカナで返します。');

会产生:

               furigana
--------------------------------------
 カンジノヨミヲカタカナデカエシマス。
(1 row)
SELECT * FROM ts_debug('japanese', E'日\n本\n語\n文\n字\n中\nの\n改\n行\nは\n除\n去\n');

会产生:

 alias |    description    | token  |  dictionaries   |  dictionary   | lexemes
-------+-------------------+--------+-----------------+---------------+----------
 word  | Word, all letters | 日本語 | {japanese_stem} | japanese_stem | {日本語}
 word  | Word, all letters | 文字   | {japanese_stem} | japanese_stem | {文字}
 word  | Word, all letters | 中     | {japanese_stem} | japanese_stem | {中}
 blank | Space symbols     | の     | {}              |               |
 word  | Word, all letters | 改行   | {japanese_stem} | japanese_stem | {改行}
 blank | Space symbols     | は     | {}              |               |
 word  | Word, all letters | 除去   | {japanese_stem} | japanese_stem | {除去}
(7 rows)
SELECT * FROM ts_debug('japanese', E'Line\nbreaks\nin\nEnglish\ntext\nare\nreserved.');

会产生:

   alias   |   description   |  token   |  dictionaries  |  dictionary  |  lexemes
-----------+-----------------+----------+----------------+--------------+-----------
 asciiword | Word, all ASCII | Line     | {english_stem} | english_stem | {line}
 blank     | Space symbols   |          | {}             |              |
 asciiword | Word, all ASCII | breaks   | {english_stem} | english_stem | {break}
 blank     | Space symbols   |          | {}             |              |
 asciiword | Word, all ASCII | in       | {english_stem} | english_stem | {}
 blank     | Space symbols   |          | {}             |              |
 asciiword | Word, all ASCII | English  | {english_stem} | english_stem | {english}
 blank     | Space symbols   |          | {}             |              |
 asciiword | Word, all ASCII | text     | {english_stem} | english_stem | {text}
 blank     | Space symbols   |          | {}             |              |
 asciiword | Word, all ASCII | are      | {english_stem} | english_stem | {}
 blank     | Space symbols   |          | {}             |              |
 asciiword | Word, all ASCII | reserved | {english_stem} | english_stem | {reserv}
 blank     | Space symbols   | .        | {}             |              |
(14 rows)
SELECT * FROM ts_debug('japanese', '日本語とEnglishがmixedな文も解析OKです。');

会产生:

   alias   |    description    |  token  |  dictionaries   |  dictionary   |  lexemes
-----------+-------------------+---------+-----------------+---------------+-----------
 word      | Word, all letters | 日本語  | {japanese_stem} | japanese_stem | {日本語}
 blank     | Space symbols     | と      | {}              |               |
 asciiword | Word, all ASCII   | English | {english_stem}  | english_stem  | {english}
 blank     | Space symbols     | が      | {}              |               |
 asciiword | Word, all ASCII   | mixed   | {english_stem}  | english_stem  | {mix}
 blank     | Space symbols     | な      | {}              |               |
 word      | Word, all letters | 文      | {japanese_stem} | japanese_stem | {文}
 blank     | Space symbols     | も      | {}              |               |
 word      | Word, all letters | 解析    | {japanese_stem} | japanese_stem | {解析}
 asciiword | Word, all ASCII   | OK      | {english_stem}  | english_stem  | {ok}
 blank     | Space symbols     | です    | {}              |               |
 blank     | Space symbols     | 。      | {}              |               |
(12 rows)
SELECT s
  FROM regexp_split_to_table(to_tsvector('japanese',
 '語尾は基本形に戻されます。')::text, ' ') AS t(s)
  ORDER BY s;

会产生:

     s
------------
 'れる':4
 '基本形':2
 '戻す':3
 '語尾':1
(4 rows)
SELECT s
   FROM regexp_split_to_table(to_tsvector('japanese',
 'ユーザとユーザーは正規化されます。ミラーとミラは別扱い。')::text, ' ') AS t(s)
  ORDER BY s;

会产生:

      s
--------------
 'する':5
 'ミラー':7
 'ミラ':8
 'ユーザ':1,2
 'れる':6
 '別':9
 '化':4
 '扱い':10
 '正規':3
(9 rows)
© www.soinside.com 2019 - 2024. All rights reserved.