【问题标题】:elasticsearch: giving score to ngramselasticsearch:给ngram打分
【发布时间】:2017-05-14 19:07:56
【问题描述】:

我正在尝试使用 elasticsearch 使用 ngrams 进行名称搜索匹配, 我尝试实现的技术如下:
输入:需要与数据库匹配的名称。
输出:来自我的名称数据库的所有潜在名称匹配。

我尝试这样做的方式如下,我将名称拆分为长度为 3-5 的 ngram。
然后,我从数据库中收集与这些 ngram 匹配的所有名称。
然后我检查 ngram 并按反向频率对它们进行排序,
这意味着常见的 ngram 将获得最低分。
例如,如果我在像“my company inc”这样的公司名称上使用它,我会给“inc” ngram 打最低分,因为 inc 出现在很多公司名称中。

我计算分数的方法是:1/(计算我所有数据库中 ngram 的出现次数),这样我就会将“最强”的 ngram 作为出现最少的 ngram。

我在 python 脚本中实现了这一点,但我想利用弹性的力量为我做同样的事情,
我知道 ngram 标记器,但是有没有办法告诉他做我做的分数?
据我所知,当我现在进行匹配时,它将根据查询中的 ngram 与他在 db 中的单词中匹配的 ngram 的多少来对结果进行评分

这是我使用的映射:

{
   "settings": {
       "analysis": {
           "analyzer": {
               "my_analyzer": {
                   "tokenizer": "my_tokenizer"
               }
           },
           "tokenizer": {
               "my_tokenizer": {
                   "type": "ngram",
                   "min_gram": 3,
                   "max_gram": 5,
                   "token_chars": ["letter", "digit"]
               }
           }
       }
   },  
   "mappings": {
       "names": {
           "properties": {
               "name": {
                   "type": "text",
                   "fields": {
                       "keyword": {
                           "type": "keyword",
                           "ignore_above": 256,
                        }
                   },
                   "analyzer": "my_analyzer"
              },
              "id": {
                 "type": "long"
               }
           }
       }
   }                  
}

这是我做的查询:

GET /names/_search
{
 "query": {
   "match" : { "name" : "my company inc"}
 }
}

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    您要使用的查询是这样的:

    {
      "query": {
        "common": {
          "name": {
            "query": "my company inc",
            "cutoff_frequency": 0.001
          }
        }
      }
    }
    

    常用词查询仅返回基于重要词(重要 nGrams)的相关性分数,即频率较低的词。此处,文档频率大于 0.1% 的词将被视为常用词,不会影响相关性得分。

    或者,如果您已经有一个预定义的停用词列表(inc、pvt、ltd),那么您可以随时在分析器中使用自定义停用词过滤器来过滤掉它们以生成匹配项。

    {
      "settings": {
        "analysis": {
          "analyzer": {
            "my_analyzer": {
              "tokenizer": "my_tokenizer",
              "filter": [
                "custom_stop_token_filter"
              ]
            }
          },
          "tokenizer": {
            "my_tokenizer": {
              "type": "ngram",
              "min_gram": 3,
              "max_gram": 5,
              "token_chars": ["letter", "digit"]
            }
          },
          "filter": {
            "custom_stop_token_filter": {
              "type": "stop",
              "stopwords": [
                "inc",
                "pvt",
                "ltd"
              ]
            }
          }
        }
      }
    }
    

    更多信息:

    【讨论】:

      猜你喜欢
      • 2016-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-11
      • 2021-11-26
      相关资源
      最近更新 更多