2

我正在尝试在弹性搜索中存储地理区域的分层数据以进行模糊匹配。

例子

美国->加利福尼亚->圣克拉拉县->帕洛阿尔托->帕洛阿尔托圣。

目前我将所有内容存储在一个平面结构中,名称和路径如下所示,例如:

{
    "name" : "Palo Alto St.",
    "path" : [
        "USA",
        "California",
        "Santa Clara County",
        "Palo Alto"
    ]
}

“帕洛阿尔托”看起来很相似

{
    "name" : "Palo Alto",
    "path" : [
        "USA",
        "California",
        "Santa Clara County"
    ]
}

然后我像这样运行一个fuzzy_like_this 查询:

{
      "query": {
      "fuzzy_like_this": {
      "like_text": "palo alto",
      "fields": [
        "name",
        "path"
      ],
      "min_similarity": 0.9,
      "prefix_length": 2
    }
  }
}

不幸的是,当我想要提高树中最浅的结果的分数时,这似乎不太好用。

是否有一些标准方法可以做到这一点,例如父/子关系?我做了一些挖掘,但没有提到任意长度的分层数据。

我对自定义分数查询进行了一些尝试,但对于这个目的它似乎不够灵活,或者我的理解有点过于肤浅。

谢谢阅读

4

1 回答 1

1

我会给这个一个刺!我将建议您使用嵌套文档和 custom_filters_score 查询(由 .90.4 中的函数 score 替换。我还没有完全研究过那个。

首先,让我们将“名称”字段放在层次结构路径中只是为了好玩。您始终可以将名称字段匹配 1.5 或 2 倍并保留字段原样,但这将使我们更加清晰。我还将要求您将数据格式更改为如下所示。

{
    "name": "Palo Alto",
    "path": [
        {
            "name": "USA",
            "level": 1
        },
        {
            "name": "California",
            "level": 2
        },
        {
            "name": "Santa Clara County",
            "level": 3
        },
        {
            "name": "Palto Alto",
            "level": 4
        }
    ]
}

现在,我将为您的字段映射更改为嵌套文档。

{
    "my_document": {
        "properties": {
            "path": {
                "type": "nested",
                "properties": {
                    "name": {
                        "type": "string"
                    },
                    "level": {
                        "type": "integer"
                    }
                }
            }
        }
    }
}

现在我们要做一个查询,这看起来有点疯狂。而且,老实说,有一些选择可以让你实现一些定制。另外,我可能会忽略一些明显的东西,但我很想听听。嘿,来晚了!

{
    "query": {
        "custom_filters_score": {
            "query": {
                "constant_score": {
                    "query": {
                        "nested": {
                            "path": "path",
                            "query": {
                                "fuzzy_like_this_field": {
                                    "path.name": {
                                        "like_text": "palo alto",
                                        "min_similarity": 0.9,
                                        "prefix_length": 2
                                    }
                                }
                            }
                        }
                    },
                    "boost": 1
                }
            },
            "filters": [
                {
                    "filter": {
                        "nested": {
                            "path": "path",
                            "query": {
                                "bool": {
                                    "must": [
                                        {
                                            "fuzzy_like_this_field": {
                                                "name": {
                                                    "like_text": "palo alto",
                                                    "min_similarity": 0.9,
                                                    "prefix_length": 2
                                                }
                                            }
                                        },
                                        {
                                            "term": {
                                                "level": 2
                                            }
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "boost": 1
                },
                {
                    "filter": {
                        "nested": {
                            "path": "path",
                            "query": {
                                "bool": {
                                    "must": [
                                        {
                                            "fuzzy_like_this_field": {
                                                "name": {
                                                    "like_text": "palo alto",
                                                    "min_similarity": 0.9,
                                                    "prefix_length": 2
                                                }
                                            }
                                        },
                                        {
                                            "term": {
                                                "level": 3
                                            }
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "boost": 2
                },
                {
                    "filter": {
                        "nested": {
                            "path": "path",
                            "query": {
                                "bool": {
                                    "must": [
                                        {
                                            "fuzzy_like_this_field": {
                                                "name": {
                                                    "like_text": "palo alto",
                                                    "min_similarity": 0.9,
                                                    "prefix_length": 2
                                                }
                                            }
                                        },
                                        {
                                            "term": {
                                                "level": 4
                                            }
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "boost": 3
                },
                {
                    "filter": {
                        "nested": {
                            "path": "path",
                            "query": {
                                "bool": {
                                    "must": [
                                        {
                                            "fuzzy_like_this_field": {
                                                "name": {
                                                    "like_text": "palo alto",
                                                    "min_similarity": 0.9,
                                                    "prefix_length": 2
                                                }
                                            }
                                        },
                                        {
                                            "term": {
                                                "level": 5
                                            }
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "boost": 4
                },
                {
                    "filter": {
                        "nested": {
                            "path": "path",
                            "query": {
                                "bool": {
                                    "must": [
                                        {
                                            "fuzzy_like_this_field": {
                                                "name": {
                                                    "like_text": "palo alto",
                                                    "min_similarity": 0.9,
                                                    "prefix_length": 2
                                                }
                                            }
                                        },
                                        {
                                            "term": {
                                                "level": 6
                                            }
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "boost": 5
                }
            ],
             "score_mode" : "max"
        }
    }
}
于 2013-10-03T04:07:36.890 回答