我正在使用具有ngram标记程序的Custom NGRAM Analyzer。我还使用了小写过滤器。该查询对于没有字符的搜索工作正常。但是当我搜索某些符号时,它失败了。由于我使用了小写的分词器,因此Elasticsearch不会分析符号。我知道空白令牌生成器可以帮助我解决问题。如何在单个分析器中使用两个标记器?映射如下:
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer":"my_tokenizer",
"filter":"lowercase"
}
},
"tokenizer": {
"my_tokenizer": {
"type": "ngram",
"min_gram": 3,
"max_gram": 3,
"token_chars": [
"letter",
"digit"
]
}
}
}
},
"mappings": {
"_doc": {
"properties": {
"title": {
"type": "text",
"analyzer": "my_analyzer"
}
}
}
}
}
有没有办法解决这个问题?
答案 0 :(得分:0)
根据elasticsearch的文档,
An analyzer must have exactly one tokenizer.
但是,您可以在设置中定义多个分析器,并且可以为每个字段配置单独的分析器。
如果您希望使用不同的分析器来使用单个字段本身,则选项之一就是按照此link
使该字段变为多字段PUT my_index
{
"mappings": {
"_doc": {
"properties": {
"title": {
"type": "text",
"analyzer": "whitespace"
"fields": {
"ngram": {
"type": "text",
"analyzer": "my_analyzer"
}
}
}
}
}
}
}
因此,如果您按照上述配置,则您的查询需要使用title
和title.ngram
字段。
GET my_index/_search
{
"query": {
"multi_match": {
"query": "search @#$ whatever",
"fields": [
"title",
"title.ngram"
],
"type": "most_fields"
}
}
}
作为另一种选择,这是您可以做的
title
的字段为my_analyzer
title
和分析器whitespace
alias
,如下所示执行以下操作:
POST _aliases
{
"actions":[
{
"add":{
"index":"index A",
"alias":"index"
}
},
{
"add":{
"index":"index B",
"alias":"index"
}
}
]
}
因此,当您最终编写查询时,它必须指向该别名,而该别名又将查询多个索引。
希望这会有所帮助!
答案 1 :(得分:0)
1)您可以尝试如下更新您的token_chars
:
"token_chars":[
"letter",
"digit",
"symbol",
"punctuation"
]
2)如果不起作用,请尝试使用以下分析仪:
{
"settings":{
"analysis":{
"filter":{
"my_filter":{
"type":"ngram",
"min_gram":3,
"max_gram":3,
"token_chars":[
"letter",
"digit",
"symbol",
"punctuation"
]
}
},
"analyzer":{
"my_analyzer":{
"type":"custom",
"tokenizer":"keyword",
"filter":[
"lowercase",
"like_filter"
]
}
}
}
},
"mappings":{
"_doc":{
"properties":{
"title":{
"type":"text",
"analyzer":"my_analyzer"
}
}
}
}
}
您需要使用关键字标记器(keyword tokenizer),然后在分析器中使用ngram标记过滤器。
答案 2 :(得分:0)
如果要使用2个标记器,则应具有2个分析器。 像这样的东西:
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer":"my_tokenizer",
"filter":"lowercase"
},
"my_analyzer_2": {
"tokenizer":"whitespace",
"filter":"lowercase"
}
},
"tokenizer": {
"my_tokenizer": {
"type": "ngram",
"min_gram": 3,
"max_gram": 3,
"token_chars": [
"letter",
"digit"
]
}
}
}
},
"mappings": {
"_doc": {
"properties": {
"title": {
"type": "text",
"analyzer": "my_analyzer"
}
}
}
}
}
通常,您还应注意分析仪在制图中的位置。 有时有必要在serach_time和index_time中都配备分析器。
"mappings":{
"_doc":{
"properties":{
"title":{
"type":"text",
"analyzer":"my_analyzer",
"search_analyzer":"my_analyzer"
}
}
}
}