根据PostgreSQL 9.4中ts_vector中出现的次数查询词位

时间:2015-10-27 23:29:32

标签: postgresql nlp postgresql-9.4 tsvector

是否可以根据词句在ts_vector中出现的次数使用WHERE语句查询PostgreSQL?

例如,如果你创建一个ts_vector,并在cat"上添加短语" top hat,你可以_Bool吗?

2 个答案:

答案 0 :(得分:1)

您可以使用此功能:

create or replace function number_of_occurrences(vector tsvector, token text)
returns integer language sql stable as $$
    select coalesce((
        select length(elem)- length(replace(elem, ',', ''))+ 1
        from unnest(string_to_array(vector::text, ' ')) elem
        where trim(elem, '''') like token || '%'), 0)
$$;

select number_of_occurrences(to_tsvector('top hat on top of the cat'), 'top');

 number_of_occurrences 
-----------------------
                     2
(1 row)

当然,只有当向量包含带位置的词位时,该函数才能正常工作。

select to_tsvector('top hat on top of the cat');

                   to_tsvector                   
-------------------------------------------------
 'cat':7 'hat':2 'of':5 'on':3 'the':6 'top':1,4
(1 row) 

使用该功能的例子:

SELECT * 
FROM a_table 
WHERE ts_vector @@ to_tsquery('top')
AND number_of_occurrences(ts_vector, 'top') = 2;

答案 1 :(得分:0)

为此,您可以结合使用unnestarray_length

SELECT *
FROM table
WHERE (
  SELECT array_length(positions, 1)
  FROM unnest(ts_vector)
  WHERE lexeme = 'top'
) = 2

我认为这不能在ts_vector上使用GIN索引,但是这可能比在接受的答案函数中执行的字符串操作要快。