我正在使用边缘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,但是由于某种原因,它似乎没有索引 token 中的数字。让我知道我是否想念这里的东西。

最佳答案

autocomplete_search中,您正在使用lowercase tokeinzer。
一起执行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

因此,在您查询的情况下。



查询实际上变成



自从字母 token 生成器于2014年下降以来。现在您的索引 token 不包含仅带有字母a的 token 。这就是为什么您没有得到任何结果的原因。

您可以在kibana中像这样分析您的查询

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

而且您会看到2014年即将下降。从最终查询。

另外,要查看字母 token 生成器产生的内容,请使用以下查询
POST _analyze
{
  "tokenizer": "letter",
  "text": "Labson PLO LTD 2014a"
}

09-07 10:57