【问题标题】:Elasticsearch 5.5: Needs help for name search (Higher score for positions)Elasticsearch 5.5:名称搜索需要帮助(职位得分较高)
【发布时间】:2017-07-12 19:24:09
【问题描述】:

我正在尝试进行自动补全,它会为键入的单词位置提供更高的分数。按分数排序,然后按名称排序。

我的目标:

输入“宠物”

结果:

peter christensen
peter christian grau
peter christian reumert krogsgaard
peter bruun christensen
anders petersen

输入“peter chr”

结果:

peter christensen
peter christian grau
peter christian reumert krogsgaard
peter bruun christensen

上面成功了,我很高兴,但是当有重复的“peter christensen”时发生了一些奇怪的事情。现在结果如下所示:

peter christian grau
peter christian reumert krogsgaard
peter christensen
peter christensen
peter bruun christensen

我想要这个:

peter christensen
peter christensen
peter christian grau
peter christian reumert krogsgaard
peter bruun christensen

请帮忙?

设置:

{
    "persons_index": {
        "settings": {
            "index": {
                "number_of_shards": "5",
                "provided_name": "persons_index",
                "creation_date": "1499881803116",
                "analysis": {
                    "filter": {
                        "ascii_folding_preserve_original": {
                            "type": "asciifolding",
                            "preserve_original": "true"
                        },
                        "names_synonym_filter": {
                            "type": "synonym",
                            "synonyms": [
                                "aage,åge",
                                "gaard,gård"
                            ]
                        }
                    },
                    "analyzer": {
                        "my_analyzer": {
                            "filter": [
                                "lowercase",
                                "trim",
                                "names_synonym_filter",
                                "ascii_folding_preserve_original"
                            ],
                            "type": "custom",
                            "tokenizer": "standard"
                        }
                    }
                },
                "number_of_replicas": "1",
                "uuid": "LxMHLha-R02i__S7gDWBtA",
                "version": {
                    "created": "5050099"
                }
            }
        }
    }
}

映射:

{
    "persons_index": {
        "mappings": {
            "persons_type": {
                "properties": {
                    "fieldDisplayFullName": {
                        "type": "text",
                        "norms": false,
                        "analyzer": "my_analyzer"
                    },
                    "fieldSort": {
                        "type": "text",
                        "norms": false,
                        "analyzer": "keyword",
                        "fielddata": true
                    }
                }
            }
        }
    }
}

示例文档

{"fieldSort" : "peter christensen", "fieldDisplayFullName" : "Peter Christensen"}

查询:

_search?pretty=true&search_type=dfs_query_then_fetch

{
  "explain": false,
  "size" : 50,
  "sort": [
        "_score",
        {
            "fieldSort": {
                "order": "asc"
            }
        }
    ],
  "query": {
    "bool" : {
      "must" : {
        "bool" : {
              "minimum_should_match":"2",
              "should" : [
                {"match" : { "fieldDisplayFullName" : "peter" }},
                {"wildcard" : { "fieldDisplayFullName" : "chr*" }}
              ]
        }
      },
       "should" : [
          {"match_phrase_prefix" : { "fieldSort" : {"query" : "peter chr","boost" : 10}}}
        ]
    }
  }
}

结果:

Peter Christensen (_score: 18.968887)
Peter Christian Engelhardt (_score: 18.968887)
Peter Christian Grau (_score: 18.968887)
Peter Christian Reumert Krogsgaard (_score: 18.968887)
Peter Christian Vagnbo Jørgensen (_score: 18.968887)
Peter Christoffersen (_score: 18.968887)
Peter Bruun Christensen (_score: 1.0512933)
Peter Dits Christensen (_score: 1.0512933)
Peter Fjeldsø Christensen (_score: 1.0512933)

重复“彼得克里斯滕森(_score:14.909464)”

Peter Christian Engelhardt (_score: 20.01772)
Peter Christian Grau (_score: 20.01772)
Peter Christian Reumert Krogsgaard (_score: 20.01772)
Peter Christian Vagnbo Jørgensen (_score: 20.01772)
Peter Christoffersen (_score: 20.01772)
Peter Christensen (_score: 14.909464)
Peter Christensen (_score: 14.909464)
Peter Bruun Christensen (_score: 1.04652)
Peter Dits Christensen (_score: 1.04652)
Peter Fjeldsø Christensen (_score: 1.04652)

不同的查询尝试没有成功:

{
  "explain": false,
  "size" : 50,
  "sort": [
        "_score",
        {
            "fieldSort": {
                "order": "asc"
            }
        }
    ],
  "query": {
    "bool" : {
      "must" : {
        "bool" : {
              "minimum_should_match":"2",
              "should" : [
                {"match" : { "fieldDisplayFullName" : "peter" }},
                {"wildcard" : { "fieldDisplayFullName" : "chr*" }}
              ]
        }
      },
       "should" : [
            {"span_first" : {
              "match" : {
                  "span_term" : { "fieldDisplayFullName" : "peter" }
              },
              "end" : 1,
              "boost" : 50.0
            }},
            {"span_first" : {
              "match" : {
                  "span_multi":{
                    "match":{
                        "wildcard" : { "fieldDisplayFullName" : "chr*" }
                    }
                  }
              },
              "end" : 2,
              "boost" : 50.0
            }}
        ]
    }
  }
}

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    用“constant_score”解决

    {
      "explain": false,
      "size" : 50,
      "sort": [
            "_score",
            {
                "fieldSort": {
                    "order": "asc"
                }
            }
        ],
      "query": {
        "bool" : {
          "must" : {
            "bool" : {
                  "minimum_should_match":"2",
                  "should" : [
                    {"match" : { "fieldDisplayFullName" : "peter" }},
                    {"wildcard" : { "fieldDisplayFullName" : "chr*" }}
                  ]
            }
          },
           "should" : [
                { "constant_score": {
                    "boost":   2,
                    "query": {"match_phrase_prefix" : { "fieldSort" : {"query" : "peter chr"}}}
                }}
            ]
        }
      }
    }
    

    【讨论】:

    • 感谢您发布解决方案!保重,多米尼克 :)
    【解决方案2】:

    看看 Elasticsearch 如何computes relevance scores 尤其是IDF(逆文档频率)。

    因此,您可以尝试多个approaches,通过忽略 IDF 来解决此问题。我有一个类似的问题,我通过将应用的search type 更改为dfs_query_then_fetch-queries 解决了这个问题。

    您的配置是否在超过 1 个shard 上运行?

    干杯,多米尼克

    【讨论】:

    • 嗨多米尼克。感谢您的回答。我刚刚用更多信息更新了我的问题。我已经在使用 search_type=dfs_query_then_fetch 了。分片数是 5?我将深入研究您今天晚些时候提供给我的链接并返回。谢谢杰斯珀
    • 感谢 Dominik 为我指明了正确的方向。阅读您的“方法”链接后,我花了 5 分钟。用“constant_score”解决。
    猜你喜欢
    • 1970-01-01
    • 2020-08-03
    • 2014-05-20
    • 2011-07-17
    • 2017-06-07
    • 2020-06-06
    • 2013-12-26
    • 2012-08-25
    • 2012-10-16
    相关资源
    最近更新 更多