Elasticsearch的一个Custom Analyzer中有多个标记器

时间:2018-09-28 06:28:55

标签: elasticsearch

我正在使用具有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"
        }
      }
    }
  }

}

有没有办法解决这个问题?

3 个答案:

答案 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"
            }
          }
        }
      }
    }
  }
}

因此,如果您按照上述配置,则您的查询需要使用titletitle.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"
        }
      }
    }
  }