我希望能够搜索以下单词
文森特文森特文森特
目前,数据库和ES的测试是Vincent的
是否有可能检测到所有格并忽略撇号.我看过Word-Delimiter,但似乎找不到合适的解释
您需要了解elasticsearch的分析器的工作原理.分析器执行标记化(将输入分成一堆标记,例如在空格上)和一组标记过滤器(过滤掉你不想要的标记,如停用词或修改标记,如小写标记过滤器,将所有内容转换为小写).
分析在两个非常特定的时间执行 - 在索引期间(当您将内容放入elasticsearch时),并且根据您的查询,在搜索期间(在您正在搜索的字符串上).
这就是说,默认分析仪是标准分析器它由一的标准标记生成器,标准令牌滤波器(清理从标准标记生成器的令牌),小写令牌过滤,并停止字令牌滤波器.
举一个例子,当你保存字符串"我爱文森特的馅饼!" 进入elasticsearch,你正在使用默认的标准分析器,你实际上存储的是"我","爱","文森特","s","馅饼".然后,当您尝试使用term
查询(未分析)搜索"Vincent's"时,您将找不到任何内容,因为"Vincent's"不是其中一个令牌!但是,如果您使用match
查询(已分析)搜索"Vincent's" ,您会发现"我爱文森特的馅饼!" 因为"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"
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
未经测试的代码,但应该可以工作。这是一个带有“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"
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
对我有用:-) ES文档: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis-word-delimiter-tokenfilter.html
Roo*_*dra -1
使用像这样的匹配查询搜索带撇号的单词。
{
"query": {
"bool": {
"must": [
{
"match": {
"_all": "Vincent Vincents Vincent's"
}
}
]
}
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5292 次 |
最近记录: |