ElasticSearch数组字段的字段规范计算

时间:2014-07-11 23:38:46

标签: elasticsearch

这是我索引中某个字段的映射:

"resourceId": {
    "type": "string",
    "index_analyzer": "partial_match",
    "search_analyzer": "lowercase",
    "include_in_all": true
}

以下是索引中使用的自定义分析器:

"analysis": {
        "filter":  {
            "partial_match_filter":  {
                "type":  "ngram",
                "min_gram":  1,
                "max_gram":  50
            }
        },
        "analyzer":  {
            "partial_match":  {
                "type":  "custom",
                "tokenizer":  "whitespace",
                "filter":  [
                    "lowercase",
                    "partial_match_filter"
                ]
            },
             "lowercase":  {
                "type":  "custom",
                "tokenizer": "whitespace",
                "filter":  [
                    "lowercase"
                ]
            }
        }
    }

此字段将包含一个字符串数组,这些字符串是资源可以拥有的多个ID(由于不同的系统通过不同的id调用每个资源,因此它可以具有多个ID)。

现在让我们假设资源#1 有三个ID:

resourceId: [3]
    0:  "ID:MATCH"
    1:  "MATCH"
    2:  "ID:ALT"

资源#2 只有一个ID:

resourceId: [1]
    0:  "ID:MATCHFIVE"

让我们假设我们针对我的索引运行此查询:

{
  "from": 0,
  "size": 30,
  "query": {
    "query_string": {
      "query": "resourceId:ID\\:MATCH"
    }
  }
}

我想要的是资源#1首先显示,因为它的数组包含完全匹配。 然而,资源#2是最重要的资源;

当我在查询请求中使用 explain 参数时,我看到 tf idf 得分两个资源相同。 但是,资源#1的规范得分较低

我的理论是,由于资源#1在数组中有三个项(我假设它们在索引期间连接在一起),因此该字段被认为更大,因此标准值减小。当涉及资源#2时,它只有一个项目(并且它比另一个数组的串联短),因此规范更高,将资源提升到顶部。

因此,我的问题是:在计算分数时,规范计算是否可以仅考虑数组中匹配项目的大小?

例如:搜索" ID:MATCH"会在resourceId [0]上的资源#1上找到完全匹配。此时,阵列中的所有其他项目将被放在一边, norm 将基于该单个项目(resourceId [0])计算,显示完美匹配。对于资源#2,规范会更低,因为resourceId字段会更大。

如果这是不可能的,是否会有解决方法与顶部完全匹配?或者我完全不理解我的理论?

0 个答案:

没有答案