问题标签 [trigram]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
postgresql - 优化 postgres 相似度查询(pg_trgm + gin index)
我定义了以下索引:
我正在执行以下查询:
该auth_user
表有 620 万行。
查询的速度似乎在很大程度上取决于查询可能返回的结果数量similarity
。
通过帮助增加相似性阈值set_limit
,但通过消除部分匹配降低了结果的有用性。
有些搜索会在 200 毫秒内返回,有些则需要 10 秒左右。
我们有一个使用 Elasticsearch 的现有实现,该功能可以在 < 200 毫秒内返回任何查询,同时进行更复杂(更好)的排名。
我想知道是否有任何方法可以改进这一点以获得更一致的性能?
我的理解是 GIN 索引(倒排索引)与 Elasticsearch 使用的基本方法相同,所以我认为可以进行一些优化。
一个EXPLAIN ANALYZE EXECUTE user_search('mel', 20)
节目:
服务器是在 Amazon RDS 上运行的 Postgres 9.6.1
更新
1.发布问题后不久,我发现了以下信息:https ://www.postgresql.org/message-id/464F3C5D.2000700@enterprisedb.com
所以我尝试了
这取得了很大的进步(以前> 10s)!
对于类似的查询,1.5s 仍然比 ES 慢,所以我仍然想听听任何优化查询的建议。
2.作为对评论的回应,并在看到这个问题(Postgresql GIN 索引比 pg_trgm 的 GIST 慢)后,我尝试了完全相同的设置,使用 GIST 索引代替 GIN 索引。
尝试与上面相同的搜索,它在 ~3.5 秒内返回,使用 default work_mem='4MB'
。增加work_mem
没有区别。
由此我得出结论,GIST 索引的内存效率更高(没有像 GIN 那样遇到病理情况),但是当 GIN 正常工作时比 GIN 慢。这与推荐 GIN 索引的文档中的描述一致。
3.我仍然不明白为什么要花这么多时间在:
我不明白为什么需要此步骤或它在做什么。
Bitmap Index Scan
每个username % $1
子句都有下面的三个……然后将这些结果与一个BitmapOr
步骤结合起来。这些部分都非常快。
但即使在我们没有用完工作内存的情况下,我们仍然在Bitmap Heap Scan
.
postgresql - 如何在 postgres 中结合全文搜索和三元组
我正在为 git 提交数据库开发搜索系统。我目前正在使用全文搜索使用户能够按作者、提交日期、日志消息和提交哈希进行搜索。目前,提交哈希仅在用户提供整个提交哈希时才有用,这很长且难以记住,但对于指定单个提交很有用。
查询数据库的查询本质上是这样的:
其中 cid 是提交哈希,tsv 是每个提交的相关信息的文本搜索向量。
我的目标是允许用户在他们的查询中只提供一部分提交哈希,并提供基本上来自他们输入的所有提交。
我研究了看起来最有前途的三元组,但我不完全确定如何将它们集成到这个查询中。
r - 计算顶级三元组
我有一个文章标题 (test$title) 及其总社交份额 (test$total_shares) 的测试文件。我可以使用say找到最常用的三元组:
但是,我想做的是通过平均份额而不是出现次数来计算顶级三元组。
我可以使用 grep 找到任何特定三元组的平均份额,例如
然后使用:
使用该三元组查看头条新闻的平均份额。
但这是一个耗时的过程。我想做的是按平均份额计算数据集中的顶级三元组。谢谢你的帮助。
这是一个示例数据集。https://d380wq8lfryn3c.cloudfront.net/wp-content/uploads/2017/06/16175029/test4.csv
我倾向于使用从标题中删除非 ascii 字符
django - Django 和近似类别
我在一家使用 Django (1.11) 开发价格比较器的公司工作。我们已经上传了商家的目录,我的工作是找到每个产品的相关类别。然后,在我们的网站中,我们有大约 22 个类别(家居、衣服、眼镜、烧烤、扬声器……)商家上传的每个目录都有数千种产品,其属性如下:-名称-描述-类别-价格-.. . 这个类别可以是每个单词或完整的类别路径(即:连衣裙>鞋子>婴儿> ...)
我的问题是:如何从提交的信息中找到最佳类别?我尝试在标题上使用三元组搜索,但我有太多错误。
你知道如何找到提交产品最合适的分类功能吗?有很多价格比较器,但我不知道它们是怎么做的。谢谢
postgresql - Postgres trigram 搜索中 AND OR NOT 的语法是什么?
我已经在我的应用程序中实现了 Postgres 9.6 trigram search https://www.postgresql.org/docs/9.6/static/pgtrgm.html,它适用于单个搜索词。
我看不到如何允许我的用户进行 AND OR NOT 搜索。
目前,如果我将“perl”放入搜索字段,它将返回数百个结果。这很棒,而且效果很好。
现在,如果我想搜索包含“perl”和“javascript”的文档,无论我输入什么搜索词,都不会返回任何结果。
例如,我尝试过:
因此,我正在努力研究如何为最终用户提供比仅单个词更复杂的搜索。我希望我的应用程序用户能够使用和/或/不进行全文搜索。
可能吗?如果是,语法是什么?
postgresql - Postgres word_similarity not comparing words
"Returns a number that indicates how similar the first string to the most similar word of the second string. The function searches in the second string a most similar word not a most similar substring. The range of the result is zero (indicating that the two strings are completely dissimilar) to one (indicating that the first string is identical to one of the words of the second string)."
That's the definition of word_similarity(a,b), as I understand it, it will look for the WORD a inside the text b, splitting b by words and getting the score of the highest match word.
However, I'm seeing some inconsistencies where the word matching is not really by word, looks like all trigrams are scrambled and compared?
Example:
Returns 1, clearly neither 'message' or 'sag' should match with 'sage', but if we combine the possible trigrams from 'message sag', we would then find that all the trigrams from 'sage' would match, but that's not really what should happen since the function description talks about word by word... Is it because both words are next to each other?
The following, will return a 0.6 score:
Edit: Fiddle to play around http://sqlfiddle.com/#!17/b4bab/1
postgresql - PostgreSQL 用 trigrams 评分距离
我想了解为什么两个单词之间的距离如此之大,只有一个字母反转。
例子:
结果:
所以, fluerie和fleurie之间的距离是0,666 !我知道这个词在比较之前被截断为“flu”、“lue”、......“rie”,但我需要在我的代码中设置一个限制,并将其固定为 0.5 最大距离以获得结果......所以在这种情况下不进行匹配。
我可以设置 0.75 的最大距离......但我不想在其他情况下匹配与搜索无关的其他术语。
一个想法:增加小词的距离是否合乎逻辑,因此取决于搜索词的宽度?
postgresql - 使用 ilike 搜索的 postgres trigram 索引太慢
我正在我们的系统中使用 ILIKE 进行模式匹配搜索,但是由于表中的记录数量,它对某些表来说太慢了。所以我正在按照这篇文章https://www.depesz.com/2011/02/19/waiting-for-9-1-faster-likeilike/中的说明实施三元索引。我没有使用全文搜索,因为我需要像 '%xxx%' 这样的搜索,而全文搜索不能很好地使用它。测试表有 16000 条记录,我在表中创建了一个新列,用于连接其他一些列的搜索。
我已经进行了一些测试,这是结果:
无索引 1639 行 30.3 秒。平均
GIN INDEX 1639 行 26.4 秒。平均
无索引 1639 行 3:02 分钟。平均
GIN INDEX 1639 行 2.56 分钟。平均
正如你所看到的,这不是一个很好的改进,帖子说查询时间减少到毫秒。解释分析表明:
索引扫描很快,但条件重新检查太慢。我读过由于误报的可能性,重新检查是不可避免的。但是我不知道如何获得更好的结果。
谁能解释为什么索引没有太大区别以及如何获得更好的查询时间?
elasticsearch - ElasticSearch 使用 ngram 术语的“最佳匹配”而不是“同义词”?
是否可以告诉 ElasticSearch 使用所有克的“最佳匹配”而不是使用克作为同义词?
默认情况下,ElasticSearch 使用grams 作为同义词并返回匹配不佳的文档。最好用例子来展示,假设我们有两个人在索引中:
我们搜索ali12345
:
它会返回alice wang
。
这怎么可能?因为默认情况下 ElasticSearch 使用grams 作为同义词,所以,即使只有一个gram 匹配 - 文档也会被匹配。
如果您检查查询,您会看到它将克视为同义词
我想知道是否可以告诉它使用“最佳匹配”查询,以实现类似:
问题:
当然可以手动生成此查询,但是您必须手动应用 ngram 解析和其他分析器管道。所以我想知道它是否可以由 ElasticSearch 完成?
当有几十克/术语时,这种长字符串查询的性能是什么?它是否会使用一些智能优化,例如搜索类似文档(请参阅
more_like_this
) - 当它尝试不使用所有术语而只使用最高的术语时tf-idf
?
附言
指标配置
python - 如何在熊猫数据框中以不同的顺序从文本数据框列中提取所有 ngram?
下面是我的输入数据框。
我想从短语中的常用词中提取 ngram,即 bigram、trigram 和 4 wordgram。让我们将短语标记为单词,然后即使经常使用的单词的顺序不同,我们也能找到 ngrams (如果我们经常使用单词作为“好电影”并且在第二个短语我们经常使用的词是“电影好”,我们可以提取二元组作为“好电影”)。我期望的示例如下所示:
正如我们在第一句中看到的,经常使用的词是“必须观看”,而在最后一句中,我们有“观看必须”,即频繁词的顺序发生了变化。因此,它以 2 的频率提取必须观看的二元组。
我需要从短语中的常用词中提取 ngrams/bigrams。
如何使用 Python 数据框实现这一点?任何帮助是极大的赞赏。
谢谢!