我正在使用边缘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 2014A
,Labson PLO LTD 2014-I
,Labson 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
,但由于某种原因,似乎它没有索引令牌中的数字。如果我在这里遗漏任何东西,请告诉我。
答案 0 :(得分:0)
在您使用autocomplete_search
tokeinzer的lowercase
中。
它同时执行Letter Tokenizer
和Lower 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"
}