我在ElasticSearch中很陌生。我尝试了大多数教程,并查看了论坛,但找不到很好的解决方案。 对于变通方法,我使用R和Elastic软件包进行馈送,而Elastic API使用Laravel / PHP进行桥接。
我正在尝试创建一个包含法国所有地址的地理编码索引,以:
1)自动填充地址
2)地理编码地址
经过多次测试后,我之所以选择nGram
,是因为在与他人一起处理文本和数字组合请求时遇到许多问题,或者我没有预期的行为或结果。
我的问题是对于长时间的请求,完成失败或容忍度不够。
假设我们要在自动填充功能中定位“ 11,rue de douai 75009 Paris”。
我将通过以下请求得到它:
11, rue de d
rue de douai
但是以下请求将无法获得结果:
11个douai
11,路德(rue de do)
doue街75号
doue 11街
在11 rue du faubourgpoissonière中
11 rue du works 11 rue du f不起作用没有结果
rue du faubourg作品 rue du faubourg p无法正常工作
福堡Poisioner作品 faubourg poissionere无法正常工作
我的索引配置如下
"settings": {
"analysis": {
"analyzer": {
"completion_analyzer": {
"type": "custom",
"filter": [
"lowercase",
"asciifolding",
"trim",
"completion_filter"
],
"tokenizer": "keyword"
}
},
"filter": {
"completion_filter": {
"type": "nGram",
"min_gram": 2,
"max_gram": 20,
"token_chars": [ "letter", "digit", "punctuation" ]
}
}
}
},
"mappings": {
"geocoding": {
"properties": {
"numero": {
"type": "long"
},
"nom_voie": {
"type": "text"
},
"ville": {
"type": "text"
},
"code_postal": {
"type": "text"
},
"code_insee": {
"type": "text"
},
"lon": {
"type": "float"
},
"lat": {
"type": "float"
},
"full_address": {
"type": "text"
},
"address_suggest": {
"type": "completion",
"max_input_length" : 150,
"analyzer": "completion_analyzer",
"search_analyzer": "standard",
"preserve_position_increments": false
}
}
}
}
}
我插入数据如下:
{
"numero" : 11,
"nom_voie" : "rue du faubourg poissonière",
"code_postal" : "75008",
"code_insee" : "75108",
"ville" : "PARIS",
"lon" : 2.37352,
"lat" : 48.85759,
"full_address" : "11, rue du faubourg poissonière 75008 PARIS",
"address_suggest" : "11 rue du faubourg poissonière 75008 PARIS",
"weight" : 2,
}
请求如下:
{
"_source" : "full_address",
"suggest" : {
"text" : query,
"completion" : {
"field" : "address_suggest",
"size" : 5,
"skip_duplicates" : TRUE,
"fuzzy" : {
"fuzziness" : 5
}
}
}
}
答案 0 :(得分:0)
从文档中还不能完全清楚,但是我相信完成提示器只会帮助您从字段的开始中完成短语或句子。因此,使用完成建议器,您必须以11 rue...
开始查询才能匹配该特定文档。
我尝试了一些内置建议程序,但是完成建议程序迫使用户以正确的单词/术语开头,而 term 和短语:建议者有助于纠正一个或多个单词的拼写错误,但从未返回与其匹配的整个字段。
我最后只是针对我想要建议的领域使用普通的“匹配”查询(根本没有使用建议者),并发现这是最好的解决方案。现在,用户可以从该字段中的任何地方获得匹配项,并且我可以显示整个字段作为建议。
使用您的字段名称,查询将如下所示:
{
"from": 0,
"size": 5,
"_source": [
"full_address"
],
"query": {
"match": {
"full_address": {
"query": query,
"fuzziness": 5,
"operator": "and"
}
}
}
}
我本人对Elasticsearch还是很陌生,所以我会请经验丰富的人,以防万一我误用了建议者。但是我逐字阅读文档,却无法让他们返回整个匹配的字段,并且该字段中的任何地方都允许匹配。
答案 1 :(得分:0)
感谢您的回答。解决它虽然不是我完全想要的行为,但我还是会返回查询而不是完成查询。
例如,我希望做一些像Deliveryoo一样平稳的事情。尚未实现!