弹性搜索中的同义词状态名称匹配

时间:2014-12-01 07:49:13

标签: java elasticsearch lucene

我使用弹性搜索将位置与弹性搜索索引匹配。

弹性搜索索引数据样本

{
"_index": "reference_2",
"_type": "geonames",
"_id": "AUn2LNJlZ8pWP0iSxZYS",
"_version": 1,
"_score": 1,
"_source": {
    "geoNameId": "7509382",
    "lat": "34.64274",
    "longi": "64.51122",
    "timeZoneId": "Asia/Kabul",
    "countryCode": "AF",
    "state": "Tamil nadu",
    "timezone": "AFT",
    "stateCode": "09",
    "alterCityName": [
        chennai
    ],
    "cityName": "chennai",
    "population": "0",
    "countryName": "India"
},
"sort": [
    1,
    "geonames",
    "reference_2"
]
}

用户可以将状态写为“tamilnadu”或tamil nadu,我希望程序或查询能够理解tamilnadu与tamil nadu相同。 任何人都可以帮助我实现这个目标

1 个答案:

答案 0 :(得分:0)

最简单的方法是定义包含您要使用的所有同义词的同义词文件。提供特定的映射到您的字段以使用该特定的同义词文件。

例如,你的同义词文件将包含类似的内容,

tamil nadu,tamilnadu,tn => tamilnadu
andhra pradesh,andra,andrhrapradesh,ap => andhrapradesh

将同义词文件的路径提供给自定义分析,并将其用于您的字段。

 "filter": {
            "custom_state": {
                "type" : "synonym",
                "synonyms_path" : "<path to synonym file>"
            },
   .....

   "analyzer": {
            "states": {
                "type":         "custom",
                "filter": [ "lowercase", "custom_state"]
            },
   .......
   "properties" : {
        "STATE" : {"type" : "string", "analyzer": "states"},
    ........

使用单独的同义词文件的优点是您可以稍后扩展/包含更多值。