Elastic Search Fuzzy Search根域和嵌套域

问题描述 投票:0回答:1

我是Elastic Search的新手,在查询时遇到了两个问题。我有一个简单的Mongodb数据库,其中包含感兴趣的城市和景点。每个集合都有一个cityName和其他详细信息(例如网站等),还有一个places对象数组。这是我的映射;

{
    "mappings": {
        "properties": {
            "cityName": {
                "type": "text"
            },
            "phone": {
                "type": "keyword"
            },
            "email": {
                "type": "keyword"
            },
            "website": {
                "type": "keyword"
            },
            "notes": {
                "type": "keyword"
            },
            "status": {
                "type": "keyword"
            },
            "places": {
                "type": "nested",
                "properties": {
                    "name": {
                        "type": "text"
                    },
                    "status": {
                        "type": "keyword"
                    },
                    "category": {
                        "type": "keyword"
                    },
                    "reviews": {
                        "properties": {
                            "rating": {
                                "type": "long"
                            },
                            "comment": {
                                "type": "keyword"
                            },
                            "user": {
                                "type": "nested"
                            }
                        }
                    }
                }
            }
        }
    }
}

我需要一个模糊查询,用户可以在其中搜索cityName和places.name,但是当我搜索单个单词时,我会得到结果,添加多个单词将返回0个匹配。我肯定我在这里缺少什么,因为我两天前开始学习弹性搜索。以下查询返回结果,因为我有一个cityName: Islamabadplaces数组的文档,其对象的name中带有关键字Islamabad,在某些places中,关键字Islamabad位于place.name的开头,在某些places对象中,可能在中间或结尾

这是我正在使用的:只有一个单词时返回结果


{
  "query": {
    "bool": {
      "should": [
        {
              "fuzzy": {
                "cityName": "Islamabad"
              }

        },
        {
          "nested": {
            "path": "places",
            "query": {
              "fuzzy": {
                "places.name": "Islamabad"
              }
            }
          }
        }
      ]
    }
  }
}

当我确实有名称为clubIslamabad club的地方时,向上面的查询添加另一个词,例如,Islamabad Golf club会返回0次匹配>

问题

搜索查询是从应用程序发送的,因此它是动态的,因此cityNameplaces.name的搜索词是相同的,并且places.name并不总是包含cityName

我到底需要什么?

我需要一个查询,我可以在其中搜索cityName和位置数组(仅搜索places.name)。该查询应为Fuzzy类型,以便在单词Islamabad拼写为Islambad时仍返回结果,甚至返回IslamAbad的结果。而且查询还应该返回多个单词的结果,我肯定在那里做错了什么。任何帮助,将不胜感激。

** P.S:**我实际上是使用MongoDB作为数据库,但是仅迁移到Elastic Search以改善我们的搜索功能。我用MongoDB尝试了不同的方法,使用了mongoose-fuzzy-searching npm模块,但是那没有用,所以如果MongoDB有一个更简单的解决方案,请也分享。

谢谢。

编辑1:

我必须更改数据的结构(映射)。现在,我有2个独立的索引,一个索引包含具有城市详细信息和cityId的城市,另一个索引针对所有地点,每个索引都有一个cityId,该索引将在以后需要时用于连接。每个地方都有一个cityName键,因此我将只搜索地方索引,因为它具有所有详细信息(地方名称和城市名称)。

我有一个城市,名字中包含单词Welder's,并且同一位置内的某些地方的名称中也包含单词Welder's,其中包含type:text。但是,当搜索welder时,以下两个查询都不会返回这些文档,而对welderswelder's的搜索会返回这些文档。我不确定为什么welderWelder's*不匹配。我在创建两个索引的过程中都没有指定任何分析器,我也没有在查询中明确定义它,任何人都可以帮助我解决这个查询,以便它按预期运行:

查询1:

] >>
{
    "query": {
        "bool": {
            "should": [
                {
                    "match": {
                        "name": {
                            "query": "welder",
                            "fuzziness": 20
                        }
                    }
                },
                 {
                    "match": {
                        "cityName": {
                            "query": "welder",
                            "fuzziness": 20
                        }
                    }
                }

            ]
        }
    }
}

查询2:

] >>
{
    "query": {
        "match": {
            "name": {
                "query": "welder",
                "fuzziness": 20
            }
        }
    }
}

我是Elastic Search的新手,在查询时遇到了两个问题。我有一个简单的Mongodb数据库,其中包含感兴趣的城市和景点。每个集合都有一个cityName和其他...

模糊查询旨在用于在一定距离内找到完整查询的近似值:

要查找相似的术语,模糊查询会创建一组变体

或指定编辑中搜索词的扩展距离。然后,查询返回完全匹配项
每个扩展。

如果您不能允许查询中单个词的模糊匹配,则需要使用已激活模糊性的匹配查询。

POST <your_index>/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "cityName": {
              "query": "Islamabad golf",
              "fuzziness": "AUTO"
            }
          }
        },
        {
          "nested": {
            "path": "places",
            "query": {
              "match": {
                "places.name": {
                  "query": "Islamabad golf",
                  "fuzziness": "AUTO"
                }
              }
            }
          }
        }
      ]
    }
  }
}

提醒: Elasticsearch中的模糊性允许每项最多2次更正。因此,您将永远无法将IslamIslamabad匹配,因为这些术语之间有4个变化。

有关距离和模糊性参数的更多信息,请参阅此文档页面fuzziness parameters

mongodb elasticsearch mongoose fuzzy-search mongoosastic
1个回答
0
投票

模糊查询旨在用于在一定距离内找到完整查询的近似值:

© www.soinside.com 2019 - 2024. All rights reserved.