ElasticSearch:我们能否在索引期间同时应用 n-gram 和语言分析器
ElasticSearch : Can we apply both n-gram and language analyzers during indexing
非常感谢@Random,我已经修改了映射如下。为了测试,我使用 "movie" 作为我的索引类型。
注意:我还添加了 search_analyzer。没有那个我就没有得到正确的结果。
但是我对使用 search_analyzer.
有以下疑问
1] 在语言分析器的情况下,我们可以使用自定义 search_analyzer 吗?
2] 我得到的所有结果都是因为我使用的 n-gram 分析器而不是英语分析器吗?
{
"settings": {
"analysis": {
"analyzer": {
"english_ngram": {
"type": "custom",
"filter": [
"english_possessive_stemmer",
"lowercase",
"english_stop",
"english_stemmer",
"ngram_filter"
],
"tokenizer": "whitespace"
},
"search_analyzer":{
"type": "custom",
"tokenizer": "whitespace",
"filter": "lowercase"
}
},
"filter": {
"english_stop": {
"type": "stop"
},
"english_stemmer": {
"type": "stemmer",
"language": "english"
},
"english_possessive_stemmer": {
"type": "stemmer",
"language": "possessive_english"
},
"ngram_filter": {
"type": "ngram",
"min_gram": 1,
"max_gram": 25
}
}
}
},
"mappings": {
"movie": {
"properties": {
"title": {
"type": "string",
"fields": {
"en": {
"type": "string",
"analyzer": "english_ngram",
"search_analyzer": "search_analyzer"
}
}
}
}
}
}
}
更新:
使用搜索分析器也不起作用consistently.and需要更多帮助this.Updating关于我的发现的问题。
我按照建议使用了以下映射(注意:此映射不使用搜索分析器),为简单起见,我们只考虑英语分析器。
{
"settings": {
"analysis": {
"analyzer": {
"english_ngram": {
"type": "custom",
"filter": [
"english_possessive_stemmer",
"lowercase",
"english_stop",
"english_stemmer",
"ngram_filter"
],
"tokenizer": "standard"
}
},
"filter": {
"english_stop": {
"type": "stop"
},
"english_stemmer": {
"type": "stemmer",
"language": "english"
},
"english_possessive_stemmer": {
"type": "stemmer",
"language": "possessive_english"
},
"ngram_filter": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 25
}
}
}
}
}
已创建索引:
PUT http://localhost:9200/movies/movie/1
{"title":"$peci@l movie"}
尝试了以下查询:
GET http://localhost:9200/movies/movie/_search
{
"query": {
"multi_match": {
"query": "$peci mov",
"fields": ["title"],
"operator": "and"
}
}
}
}
我没有得到任何结果,我做错了什么吗?
我正在尝试获取结果:
1] Special characters
2] Partial matches
3] Space separated partial and full words
再次感谢!
您可以基于语言分析器创建自定义分析器。唯一的区别是您将 ngram_filter
令牌过滤器添加到链的末尾。在这种情况下,您首先会获得最终转换为边缘 ngram 的语言词干标记(默认链)(您的过滤器)。您可以在此处 https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-lang-analyzer.html#english-analyzer 找到语言分析器的实现,以便覆盖它们。这是英语语言更改的示例:
{
"settings": {
"analysis": {
"analyzer": {
"english_ngram": {
"type": "custom",
"filter": [
"english_possessive_stemmer",
"lowercase",
"english_stop",
"english_stemmer",
"ngram_filter"
],
"tokenizer": "standard"
}
},
"filter": {
"english_stop": {
"type": "stop"
},
"english_stemmer": {
"type": "stemmer",
"language": "english"
},
"english_possessive_stemmer": {
"type": "stemmer",
"language": "possessive_english"
},
"ngram_filter": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 25
}
}
}
}
}
更新
要支持特殊字符,您可以尝试使用 whitespace
分词器而不是 standard
。在这种情况下,这些字符将成为您的令牌的一部分:
{
"settings": {
"analysis": {
"analyzer": {
"english_ngram": {
"type": "custom",
"filter": [
"english_possessive_stemmer",
"lowercase",
"english_stop",
"english_stemmer",
"ngram_filter"
],
"tokenizer": "whitespace"
}
},
"filter": {
"english_stop": {
"type": "stop"
},
"english_stemmer": {
"type": "stemmer",
"language": "english"
},
"english_possessive_stemmer": {
"type": "stemmer",
"language": "possessive_english"
},
"ngram_filter": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 25
}
}
}
}
}
非常感谢@Random,我已经修改了映射如下。为了测试,我使用 "movie" 作为我的索引类型。 注意:我还添加了 search_analyzer。没有那个我就没有得到正确的结果。 但是我对使用 search_analyzer.
有以下疑问1] 在语言分析器的情况下,我们可以使用自定义 search_analyzer 吗?
2] 我得到的所有结果都是因为我使用的 n-gram 分析器而不是英语分析器吗?
{
"settings": {
"analysis": {
"analyzer": {
"english_ngram": {
"type": "custom",
"filter": [
"english_possessive_stemmer",
"lowercase",
"english_stop",
"english_stemmer",
"ngram_filter"
],
"tokenizer": "whitespace"
},
"search_analyzer":{
"type": "custom",
"tokenizer": "whitespace",
"filter": "lowercase"
}
},
"filter": {
"english_stop": {
"type": "stop"
},
"english_stemmer": {
"type": "stemmer",
"language": "english"
},
"english_possessive_stemmer": {
"type": "stemmer",
"language": "possessive_english"
},
"ngram_filter": {
"type": "ngram",
"min_gram": 1,
"max_gram": 25
}
}
}
},
"mappings": {
"movie": {
"properties": {
"title": {
"type": "string",
"fields": {
"en": {
"type": "string",
"analyzer": "english_ngram",
"search_analyzer": "search_analyzer"
}
}
}
}
}
}
}
更新:
使用搜索分析器也不起作用consistently.and需要更多帮助this.Updating关于我的发现的问题。
我按照建议使用了以下映射(注意:此映射不使用搜索分析器),为简单起见,我们只考虑英语分析器。
{
"settings": {
"analysis": {
"analyzer": {
"english_ngram": {
"type": "custom",
"filter": [
"english_possessive_stemmer",
"lowercase",
"english_stop",
"english_stemmer",
"ngram_filter"
],
"tokenizer": "standard"
}
},
"filter": {
"english_stop": {
"type": "stop"
},
"english_stemmer": {
"type": "stemmer",
"language": "english"
},
"english_possessive_stemmer": {
"type": "stemmer",
"language": "possessive_english"
},
"ngram_filter": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 25
}
}
}
}
}
已创建索引:
PUT http://localhost:9200/movies/movie/1
{"title":"$peci@l movie"}
尝试了以下查询:
GET http://localhost:9200/movies/movie/_search
{
"query": {
"multi_match": {
"query": "$peci mov",
"fields": ["title"],
"operator": "and"
}
}
}
}
我没有得到任何结果,我做错了什么吗? 我正在尝试获取结果:
1] Special characters
2] Partial matches
3] Space separated partial and full words
再次感谢!
您可以基于语言分析器创建自定义分析器。唯一的区别是您将 ngram_filter
令牌过滤器添加到链的末尾。在这种情况下,您首先会获得最终转换为边缘 ngram 的语言词干标记(默认链)(您的过滤器)。您可以在此处 https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-lang-analyzer.html#english-analyzer 找到语言分析器的实现,以便覆盖它们。这是英语语言更改的示例:
{
"settings": {
"analysis": {
"analyzer": {
"english_ngram": {
"type": "custom",
"filter": [
"english_possessive_stemmer",
"lowercase",
"english_stop",
"english_stemmer",
"ngram_filter"
],
"tokenizer": "standard"
}
},
"filter": {
"english_stop": {
"type": "stop"
},
"english_stemmer": {
"type": "stemmer",
"language": "english"
},
"english_possessive_stemmer": {
"type": "stemmer",
"language": "possessive_english"
},
"ngram_filter": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 25
}
}
}
}
}
更新
要支持特殊字符,您可以尝试使用 whitespace
分词器而不是 standard
。在这种情况下,这些字符将成为您的令牌的一部分:
{
"settings": {
"analysis": {
"analyzer": {
"english_ngram": {
"type": "custom",
"filter": [
"english_possessive_stemmer",
"lowercase",
"english_stop",
"english_stemmer",
"ngram_filter"
],
"tokenizer": "whitespace"
}
},
"filter": {
"english_stop": {
"type": "stop"
},
"english_stemmer": {
"type": "stemmer",
"language": "english"
},
"english_possessive_stemmer": {
"type": "stemmer",
"language": "possessive_english"
},
"ngram_filter": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 25
}
}
}
}
}