Elasticsearch同义词区分大小写的结果

时间:2014-11-18 18:43:05

标签: jdbc elasticsearch lowercase synonym

任何人都可以给我一个提示我做错了什么。 我试图以这种方式设置elasticsearch

{
    "settings" : {
        "index" : {
            "analysis" : {
                "analyzer" : {
                    "synonym" : {
                        "type" : "custom",
                        "tokenizer" : "whitespace",
                        "filter" : ["en_US", "lowercase", "synonym"]
                    }
                },
                "filter" : {
                    "synonym" : {
                        "type" : "synonym",
                        "synonyms_path" : "analysis/synonym.txt"
                    },
                    "en_US" : {
                        "type" : "hunspell",
                        "locale" : "en_US",
                        "dedup" : true
                    }
                }
            }
        }
    },
    "mappings" : {
        "jdbc" : {
            "properties" : {
                "Title" : {
                    "type" : "string",
                    "search_analyzer" : "synonym",
                    "index_analyzer" : "standard"
                },
                "Abstract" : {
                    "type" : "string",
                    "search_analyzer" : "synonym",
                    "index_analyzer" : "standard"
                }
            }
        }
    }
}

我的synonym.txt文件包含

beer, ale, lager, cark ale
Lithuania, Republic of Lithuania, Lithuanian

所以现在是时候试用我的分析仪了:

http://localhost:9200/jdbc/_analyze?text=beer&analyzer=synonym&pretty=true

按预期工作并返回给我

{
  "tokens" : [ {
    "token" : "beer",
    "start_offset" : 0,
    "end_offset" : 4,
    "type" : "SYNONYM",
    "position" : 1
  }, {
    "token" : "ale",
    "start_offset" : 0,
    "end_offset" : 4,
    "type" : "SYNONYM",
    "position" : 1
  }, {
    "token" : "lager",
    "start_offset" : 0,
    "end_offset" : 4,
    "type" : "SYNONYM",
    "position" : 1
  }, {
    "token" : "cark",
    "start_offset" : 0,
    "end_offset" : 4,
    "type" : "SYNONYM",
    "position" : 1
  }, {
    "token" : "ale",
    "start_offset" : 0,
    "end_offset" : 4,
    "type" : "SYNONYM",
    "position" : 1
  } ]
}

然而,查询这个:

http://localhost:9200/jdbc/_analyze?text=Lithuanian&analyzer=synonym&pretty=true

仅返回:

{
  "tokens" : [ {
    "token" : "lithuanian",
    "start_offset" : 0,
    "end_offset" : 10,
    "type" : "word",
    "position" : 1
  } ]
}

任何提示?

1 个答案:

答案 0 :(得分:2)

在分析期间,将按指定的顺序应用令牌过滤器。 所以在上述案例中,立陶宛"首先转换为小写"立陶宛"。 由于同义词文件不包含此案例版本的令牌,因此不会发生同义词转换。 elasticsearch guide中的这一部分详细讨论了这一点。

根据用例,有两种方法可以解决这个问题,或者将自定义分析器中令牌过滤器的顺序更改为:

  "synonym" : {
         "type" : "custom",
         "tokenizer" : "whitespace",
          "filter" : ["en_US", "synonym","lowercase"]
   }

上述内容仍然区分大小写,但转换与上述内容一致 synonyms.txt

或者您可以将analysis / synonym.txt中的所有同义词设置为小写,并保持问题中指定的相同分析器设置。 例如:

  beer, ale, lager, cark ale
  lithuania, republic of lithuania, lithuanian
相关问题