当数据之间有 space 或破折号时,哪个分析器可以获得附加词的结果?
Which Analyzer to get results of appended words when data has space or dash in between?
我的映射如下所示。如您所见,Name 字段已被分析
{
"state":"open",
"settings":{
"index":{
"creation_date":"1453816191454",
"number_of_shards":"5",
"number_of_replicas":"1",
"version":{
"created":"1070199"
},
}
},
"mappings":{
"Product":{
"properties":{
"index":"not_analyzed",
"store":true,
"type":"string"
},
"Name":{
"store":true,
"type":"string"
},
"Number":{
"index":"not_analyzed",
"store":true,
"type":"string"
},
"id":{
"index":"no",
"store":true,
"type":"integer"
}
}
},
"aliases":[
]
}
}
当我查询如下
"query": {
"match_phrase": {
"Name": "hl-2240"
}
}
这工作正常而且 "hl 2240" 工作正常但是当我输入 "hl2240" 时。我没有得到任何结果。我知道这是因为名称被索引为 "hl-2240" 我想我正在使用标准或通用分析器并将其标记为 hl 和 2240。虽然我在反向索引中没有任何标记为 hl2240,但它没有找到任何东西.我了解到我应该使用另一个分析仪。但这就是我被困的地方。我可以使用哪种分析仪?我应该重新索引我的索引还是我只能使用分析器来查询?如果我更改分析器以索引我的数据,我想确保我不会丢失搜索 "hl-2240" 或 "hl 2240".
的结果
更新:嵌套查询我试过 Richa 的回答。
Client.CreateIndex("myIndex",
ci => ci.Analysis(a => a.TokenFilters(f => f.Add("my_word_delimiter", new WordDelimiterTokenFilter
{
CatenateAll = true
}))
.Analyzers(an => an.Add("my_analyzer", new CustomAnalyzer
{
Tokenizer = "whitespace",
Filter = new List<string> {"standard",
"lowercase",
"my_word_delimiter"}
}))));
尝试使用这个analyzer
:
{
"settings": {
"analysis": {
"filter": {
"my_word_delimiter": {
"type": "word_delimiter",
"catenate_all": true <=== Notice this
}
},
"analyzer": {
"my_analyzer": {
"type": "custom",
"tokenizer": "whitespace",
"filter": [
"standard",
"lowercase",
"my_word_delimiter"
]
}
}
}
}
}
了解 catenate_all。
使用以下命令查看字符串是如何标记化的:
curl -XGET "localhost:9200/index_8/_analyze?analyzer=my_analyzer&pretty=true" -d 'hl-2240'
这将产生以下输出并且 hl-2240
将被索引为
{
"tokens" : [ {
"token" : "hl",
"start_offset" : 0,
"end_offset" : 2,
"type" : "word",
"position" : 0
}, {
"token" : "hl2240",
"start_offset" : 0,
"end_offset" : 7,
"type" : "word",
"position" : 0
}, {
"token" : "2240",
"start_offset" : 3,
"end_offset" : 7,
"type" : "word",
"position" : 1
} ]
}
希望对你有帮助
我的映射如下所示。如您所见,Name 字段已被分析
{
"state":"open",
"settings":{
"index":{
"creation_date":"1453816191454",
"number_of_shards":"5",
"number_of_replicas":"1",
"version":{
"created":"1070199"
},
}
},
"mappings":{
"Product":{
"properties":{
"index":"not_analyzed",
"store":true,
"type":"string"
},
"Name":{
"store":true,
"type":"string"
},
"Number":{
"index":"not_analyzed",
"store":true,
"type":"string"
},
"id":{
"index":"no",
"store":true,
"type":"integer"
}
}
},
"aliases":[
]
}
}
当我查询如下
"query": {
"match_phrase": {
"Name": "hl-2240"
}
}
这工作正常而且 "hl 2240" 工作正常但是当我输入 "hl2240" 时。我没有得到任何结果。我知道这是因为名称被索引为 "hl-2240" 我想我正在使用标准或通用分析器并将其标记为 hl 和 2240。虽然我在反向索引中没有任何标记为 hl2240,但它没有找到任何东西.我了解到我应该使用另一个分析仪。但这就是我被困的地方。我可以使用哪种分析仪?我应该重新索引我的索引还是我只能使用分析器来查询?如果我更改分析器以索引我的数据,我想确保我不会丢失搜索 "hl-2240" 或 "hl 2240".
的结果更新:嵌套查询我试过 Richa 的回答。
Client.CreateIndex("myIndex",
ci => ci.Analysis(a => a.TokenFilters(f => f.Add("my_word_delimiter", new WordDelimiterTokenFilter
{
CatenateAll = true
}))
.Analyzers(an => an.Add("my_analyzer", new CustomAnalyzer
{
Tokenizer = "whitespace",
Filter = new List<string> {"standard",
"lowercase",
"my_word_delimiter"}
}))));
尝试使用这个analyzer
:
{
"settings": {
"analysis": {
"filter": {
"my_word_delimiter": {
"type": "word_delimiter",
"catenate_all": true <=== Notice this
}
},
"analyzer": {
"my_analyzer": {
"type": "custom",
"tokenizer": "whitespace",
"filter": [
"standard",
"lowercase",
"my_word_delimiter"
]
}
}
}
}
}
了解 catenate_all。
使用以下命令查看字符串是如何标记化的:
curl -XGET "localhost:9200/index_8/_analyze?analyzer=my_analyzer&pretty=true" -d 'hl-2240'
这将产生以下输出并且 hl-2240
将被索引为
{
"tokens" : [ {
"token" : "hl",
"start_offset" : 0,
"end_offset" : 2,
"type" : "word",
"position" : 0
}, {
"token" : "hl2240",
"start_offset" : 0,
"end_offset" : 7,
"type" : "word",
"position" : 0
}, {
"token" : "2240",
"start_offset" : 3,
"end_offset" : 7,
"type" : "word",
"position" : 1
} ]
}
希望对你有帮助