postgresql - elasticsearch ngram 和 postgresql trigram 搜索结果不匹配

标签 postgresql elasticsearch similarity n-gram sentence-similarity

我在 elasticsearch 上创建了一个索引,如下所示:

"settings" : {
    "number_of_shards": 1,
    "number_of_replicas": 0,
    "analysis": {
                "filter": {
                    "trigrams_filter": {
                        "type":     "ngram",
                        "min_gram": 3,
                        "max_gram": 3
                    }
                },
                "analyzer": {
                    "trigrams": {
                        "type":      "custom",
                        "tokenizer": "standard",
                        "filter":   [
                            "lowercase",
                            "trigrams_filter"
                        ]
                    }
                }
    }
},
"mappings": {
    "issue": {
        "properties": {
            "description": {
                "type":     "string",
                "analyzer": "trigrams"
            }
        }
    }
}

我的测试项目如下:

"alici onay verdi basarili satisiniz gerceklesti diyor ama hesabima para transferi gerceklesmemis"

"otomatik onay işlemi gecikmiş"

"************* nolu iade islemi urun kargoya verilmedi zamaninda iade islemlerinde urun erorr hata veriyor"

我用下面的查询测试了这个索引:

GET issue/_search
{
  "query": {
      "match": {
            "description":{
                 "query": "otomatik onay istemi zamaninda gerceklesmemis"
            }
       }
   }
}

结果:

{
      ....
      "hits": {
            ....
                "max_score": 2.3507352,
                "hits": [
                          {
                              ....                                   
                              "_score": 2.3507352,
                              "_source": {
                                   "issue_id": "*******",
                                   "description": "alici onay verdi basarili satisiniz gerceklesti diyor ama hesabima para transferi gerceklesmemis"
                                          }
                           }
                        ]
                }
 }

但是 postgresql 上的相同数据使用以下 SQL 响应另一个结果:

SELECT 
     public.tbl_issue_descriptions_big.description,
     similarity(description, 'otomatik onay islemi zamaninda gerceklesmemis') AS sml
FROM
     public.tbl_issue_descriptions_big
WHERE
     description %'otomatik onay islemi zamaninda gerceklesmemis'
ORDER BY
     sml DESC
LIMIT 10

结果是:

description                                           | sml
======================================================|======
otomatik onay islemi gecikmis                         |0,351852

为什么会造成这种差异?

最佳答案

我对 postgres 的了解不够,无法在那里给出合格的答案(因为这也取决于被索引的文档以及它们的评分公式是否完全相同,我对此表示怀疑),但 Elasticsearch 有一个 explain API和一个 explain parameter在搜索中,这可以帮助您找出为什么某个文档被这样评分。

关于postgresql - elasticsearch ngram 和 postgresql trigram 搜索结果不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45143583/

相关文章:

r - 两个字符串的最佳相似性距离度量

mysql - Windows 上的 CPU 使用率 PostgreSQL 与 MySQL

elasticsearch - Elasticsearch:如果任何嵌套对象字段与术语值匹配,则不返回文档

elasticsearch - Elasticsearch:使用Java API通过路由创建别名并进行过滤

elasticsearch - elasticsearch面嵌套聚合

java - 找到最相似值的有效方法

c++ - 加快图像中的自相似性

java - Spring Data JPA - 保存重复的复合键时不会出现任何错误

database - 仅 1 个数据库的 Postgres 重新分配拥有

java - 带有证书 : how to set client certificate and key? 的 Nifi 和 Postgresql