我希望能够搜索以下单词
文森特文森特文森特的
目前在 Database 和 ES 中的测试是 Vincent 的
是否可以检测所有格并忽略撇号。我已经查看了 Word-Delimiter,但似乎找不到合适的解释
我希望能够搜索以下单词
文森特文森特文森特的
目前在 Database 和 ES 中的测试是 Vincent 的
是否可以检测所有格并忽略撇号。我已经查看了 Word-Delimiter,但似乎找不到合适的解释
您需要了解 elasticsearch 的分析器是如何工作的。分析器执行标记化(将输入拆分为一堆标记,例如空格)和一组标记过滤器(过滤掉您不想要的标记,例如停用词,或修改标记,例如小写标记过滤器将所有内容转换为小写)。
分析在两个非常特定的时间执行 - 在索引期间(当您将内容放入弹性搜索时)以及根据您的查询,在搜索期间(在您正在搜索的字符串上)。
也就是说,默认分析器是标准分析器,它由标准标记器、标准标记过滤器(从标准标记器中清除标记)、小写标记过滤器和停用词标记过滤器组成。
举个例子,当你保存字符串“I love Vincent's pie!”时 进入elasticsearch,你使用的是默认的标准分析器,你实际上存储了“i”、“love”、“vincent”、“s”、“pie”。然后,当您尝试使用term
查询(未分析)搜索“Vincent's”时,您将找不到任何内容,因为“Vincent's”不是这些标记之一!match
但是,如果您使用查询(已分析)搜索“Vincent's” ,您会发现“I love Vincent's pie!” 因为“vincent”和“s”都找到了匹配项。
底线,要么:
match
在搜索自然语言字符串时使用已分析的查询,例如。如需进一步阅读,请参阅http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis.html 。
使用 ES 文档中描述的“possessive_english”词干分析器: http ://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis-stemmer-tokenfilter.html
例子:
{
"index" : {
"analysis" : {
"analyzer" : {
"my_analyzer" : {
"tokenizer" : "standard",
"filter" : ["standard", "lowercase", "my_stemmer"]
}
},
"filter" : {
"my_stemmer" : {
"type" : "stemmer",
"name" : "possessive_english"
}
}
}
}
}
未经测试的代码,但应该可以工作。这是一个带有“word_delimiter”的经过测试的示例:
{
"index" : {
"analysis" : {
"analyzer" : {
"my_analyzer" : {
"tokenizer" : "standard",
"filter" : ["standard", "lowercase", "my_word_delimiter"]
}
},
"filter" : {
"my_word_delimiter" : {
"type" : "word_delimiter",
"preserve_original": "true"
}
}
}
}
}
为我工作:-) ES 文档: http ://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis-word-delimiter-tokenfilter.html
使用像这样的匹配查询搜索带有撇号的单词。
{
"query": {
"bool": {
"must": [
{
"match": {
"_all": "Vincent Vincents Vincent's"
}
}
]
}
}
}