edge_ngram tokenizer的问题在弹性搜索中

时间:2016-12-16 12:50:19

标签: elasticsearch

我正在使用边缘ngram标记器来提供部分匹配。 我的文件看起来像

Name
Labson series LTD 2014
Labson PLO LTD 2014A
Labson PLO LTD 2014-I
Labson PLO LTD. 2014-II

我的映射如下

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "autocomplete": {
          "tokenizer": "autocomplete",
          "filter": [
            "lowercase"
          ]
        },
        "autocomplete_search": {
          "tokenizer": "lowercase"
        }
      },
      "tokenizer": {
        "autocomplete": {
          "type": "edge_ngram",
          "min_gram": 2,
          "max_gram": 40,
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      }
    }
  },
  "mappings": {
    "doc": {
      "properties": {
        "title": {
          "type": "string",
          "analyzer": "autocomplete",
          "search_analyzer": "autocomplete_search"
        }
      }
    }
  }
}

PUT my_index/doc/1
{
  "title": "Labson Series LTD 2014" 
}

PUT my_index/doc/2
{
  "title": "Labson PLO LTD 2014A" 
}


PUT my_index/doc/3
{
  "title": "Labson PLO LTD 2014-I" 
}


PUT my_index/doc/4
{
  "title": "Labson PLO LTD. 2014-II" 
}

以下查询为我提供了3个正确的文档(Labson PLO LTD 2014ALabson PLO LTD 2014-ILabson PLO LTD. 2014-II

GET my_index/_search
{
  "query": {
    "match": {
      "title": {
        "query": "labson plo", 
        "operator": "and"
      }
    }
  }
}

但是当我输入Labson PLO 2014A时,它会给我0个文件

GET my_index/_search
{
  "query": {
    "match": {
      "title": {
        "query": "Labson PLO 2014A", 
        "operator": "and"
      }
    }
  }
}

我希望这会返回1个文档Labson PLO LTD 2014A,但由于某种原因,似乎它没有索引令牌中的数字。如果我在这里遗漏任何东西,请告诉我。

1 个答案:

答案 0 :(得分:0)

在您使用autocomplete_search tokeinzer的lowercase中。 它同时执行Letter TokenizerLower Case Token Filter的功能。

https://www.elastic.co/guide/en/elasticsearch/reference/2.3//analysis-lowercase-tokenizer.html

现在让我们看看Letter Tokenizer做了什么。

  

只要遇到不是字母的字符,字母标记器就会将文本分成多个术语。

https://www.elastic.co/guide/en/elasticsearch/reference/master/analysis-letter-tokenizer.html

所以在您询问的情况下。

  

"查询":" Labson PLO 2014A",

查询实际上变为

  

" + title:labson + title:plo + title:a"

因为字母标记符已于2014年删除。现在您的索引标记不包含仅包含字母a的标记。这就是为什么你没有得到任何结果。

您可以在kibana中分析您的查询

POST my_index/_validate/query?explain
{
  "query": {
    "match": {
      "title": {
        "query": "Labson PLO 2014a", 
        "operator": "and"
      }
    }
  }
}

你会看到2014年正在下降。从最后的查询。

另外,要查看字母标记生成器产生的内容,请使用以下查询

POST _analyze
{
  "tokenizer": "letter",
  "text": "Labson PLO LTD 2014a"
}