Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用ElasticSearch搜索全球位置名称的有效方法是什么?_Search_Location_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch - Fatal编程技术网 elasticsearch,Search,Location,elasticsearch" /> elasticsearch,Search,Location,elasticsearch" />

使用ElasticSearch搜索全球位置名称的有效方法是什么?

使用ElasticSearch搜索全球位置名称的有效方法是什么?,search,location,elasticsearch,Search,Location,elasticsearch,我有通过解析到关系数据库提供的位置信息。利用这些信息,我试图建立一个ElasticSearch索引,其中包含人口稠密的地方(城市)名称、行政区划(州、省等)名称、国家名称和国家代码。我的目标是提供类似于谷歌地图的位置搜索: 我不需要很酷的粗体突出显示,但我确实需要搜索以类似的方式返回类似的结果。我尝试过用一个位置字段创建一个映射,该字段由整个位置名称组成(例如,“德克萨斯州圆岩镇),我还尝试过用五个单独的字段组成一个位置的每个部分。我尝试过关键字和前缀查询以及edgengram分析器;我一直未

我有通过解析到关系数据库提供的位置信息。利用这些信息,我试图建立一个ElasticSearch索引,其中包含人口稠密的地方(城市)名称、行政区划(州、省等)名称、国家名称和国家代码。我的目标是提供类似于谷歌地图的位置搜索:

我不需要很酷的粗体突出显示,但我确实需要搜索以类似的方式返回类似的结果。我尝试过用一个位置字段创建一个映射,该字段由整个位置名称组成(例如,“德克萨斯州圆岩镇),我还尝试过用五个单独的字段组成一个位置的每个部分。我尝试过关键字和前缀查询以及edgengram分析器;我一直未能找到正确的配置以使其正常工作

为了实现我的目标,我应该使用什么样的分析器——索引和搜索?这个搜索不必像谷歌那样完美,但我希望它至少是类似的

我确实希望支持部分名称匹配,这就是为什么我一直在摆弄EdgeGram。例如,搜索“round r”应与美国德克萨斯州的round Rock匹配。此外,我更希望填充的地名(城市)以精确搜索词开头的结果排名高于其他结果。例如,搜索“Rond Roc”时,应在搜索Rond Rock(罗马尼亚)之前匹配美国德克萨斯州的round Rock。我希望我已经说得够清楚了

这是我当前的索引配置(这是C#中的匿名类型,稍后序列化为JSON并传递给ElasticSearch API):


这可能就是您正在寻找的:

  "analysis": {
    "tokenizer": {
      "name_tokenizer": {
        "type": "edgeNGram",
        "max_gram": 100,
        "min_gram": 2,
        "side": "front"
      }
    },
    "analyzer": {
      "name_analyzer": {
        "tokenizer": "whitespace",
        "type": "custom",
        "filter": ["lowercase", "multi_words", "name_filter"]
      },
    },
    "filter": {
      "multi_words": {
        "type": "shingle",
        "min_shingle_size": 2,
        "max_shingle_size": 10
      },
      "name_filter": {
        "type": "edgeNGram",
        "max_gram": 100,
        "min_gram": 2,
        "side": "front"
      },          
    }
  }

我认为使用
name\u analyzer
将复制您所说的谷歌搜索。您可以稍微调整配置以满足您的需要。

karmi on#elasticsearch IRC建议我应该研究elasticsearch中的实验性“suggester”功能。根据我的需要,suggester似乎比前缀查询或EdgeGrams工作得更好。谢谢,我一定会将其与suggester实现进行比较。顺便说一句,
side
在最新的ES构建中被弃用。我最终选择了完成建议。我不确定我是否正确使用了它,但使用它进行这种搜索非常容易。好的,是的,
suggester
似乎是最合适的解决方案。当elasticsearch中没有添加
suggester
时,我提供的一个非常旧。正如您正确指出的,
已被弃用
EdgeGram
,现在,默认情况下,将
一侧作为
前部
  "analysis": {
    "tokenizer": {
      "name_tokenizer": {
        "type": "edgeNGram",
        "max_gram": 100,
        "min_gram": 2,
        "side": "front"
      }
    },
    "analyzer": {
      "name_analyzer": {
        "tokenizer": "whitespace",
        "type": "custom",
        "filter": ["lowercase", "multi_words", "name_filter"]
      },
    },
    "filter": {
      "multi_words": {
        "type": "shingle",
        "min_shingle_size": 2,
        "max_shingle_size": 10
      },
      "name_filter": {
        "type": "edgeNGram",
        "max_gram": 100,
        "min_gram": 2,
        "side": "front"
      },          
    }
  }