gpt4 book ai didi

elasticsearch mapping tokenizer 关键字以避免拆分 token 并启用通配符

转载 作者:行者123 更新时间:2023-11-29 02:44:47 25 4
gpt4 key购买 nike

我尝试在给定字段上使用 angularjs 和 elasticsearch 创建自动完成功能,例如 countryname。它可以包含简单的名称,如“法国”、“西类牙”或“组合名称”,如“塞拉利昂”。

在映射中,此字段not_analyzed 以防止弹性标记化“组合名称”

"COUNTRYNAME" : {"type" : "string", "store" : "yes","index": "not_analyzed" }

我需要查询elasticsearch:

  • 使用诸如“countryname:value”之类的内容来过滤文档,其中值可以包含通配符
  • 并对过滤器返回的国家/地区名称进行聚合,(我进行聚合只是为了获取不同的数据,计数对我和她来说毫无用处,也许有更好的解决方案)

我不能在“not_analyzed”字段中使用通配符:

这是我的查询,但“值”变量中的通配符不起作用并且区分大小写:

通配符独自她的工作:

curl -XGET 'local_host:9200/botanic/specimens/_search?size=0' -d '{
"fields": [
"COUNTRYNAME"
],
"query": {
"query_string": {
"query": "COUNTRYNAME:*"
}
},
"aggs": {
"general": {
"terms": {
"field": "COUNTRYNAME",
"size": 0
}
}
}
}'

但这行不通 (franc*) :

curl -XGET 'local_host:9200/botanic/specimens/_search?size=0' -d '{
"fields": [
"COUNTRYNAME"
],
"query": {
"query_string": {
"query": "COUNTRYNAME:Franc*"
}
},
"aggs": {
"general": {
"terms": {
"field": "COUNTRYNAME",
"size": 0
}
}
}
}'

我也尝试使用 bool must query 但不使用这个 not_analyzed 字段和通配符:

curl -XGET 'local_host:9200/botanic/specimens/_search?size=0' -d '{
"fields": [
"COUNTRYNAME"
],
"query": {
"bool": {
"must": [
{
"match": {
"COUNTRYNAME": "Franc*"
}
}
]
}
},
"aggs": {
"general": {
"terms": {
"field": "COUNTRYNAME",
"size": 0
}
}
}
}'

我遗漏了什么或做错了什么?我应该在映射中保留字段 analyzed 并使用另一个不将组合名称拆分为 token 的分析器吗?

最佳答案

我找到了一个可行的解决方案:“关键字”分词器。创建一个自定义分析器并将其用于我想保留的字段的映射中,而不用空格分隔:

    curl -XPUT 'localhost:9200/botanic/' -d '{
"settings":{
"index":{
"analysis":{
"analyzer":{
"keylower":{
"tokenizer":"keyword",
"filter":"lowercase"
}
}
}
}
},
"mappings":{
"specimens" : {
"_all" : {"enabled" : true},
"_index" : {"enabled" : true},
"_id" : {"index": "not_analyzed", "store" : false},
"properties" : {
"_id" : {"type" : "string", "store" : "no","index": "not_analyzed" } ,
...
"LOCATIONID" : {"type" : "string", "store" : "yes","index": "not_analyzed" } ,
"AVERAGEALTITUDEROUNDED" : {"type" : "string", "store" : "yes","index": "analyzed" } ,
"CONTINENT" : {"type" : "string","analyzer":"keylower" } ,
"COUNTRYNAME" : {"type" : "string","analyzer":"keylower" } ,
"COUNTRYCODE" : {"type" : "string", "store" : "yes","index": "analyzed" } ,
"COUNTY" : {"type" : "string","analyzer":"keylower" } ,
"LOCALITY" : {"type" : "string","analyzer":"keylower" }
}
}
}
}'

所以我可以在未拆分的字段 COUNTRYNAME 的查询中使用通配符:

curl -XGET 'localhost:9200/botanic/specimens/_search?size=10' -d '{
"fields" : ["COUNTRYNAME"],
"query": {"query_string" : {
"query": "COUNTRYNAME:bol*"
}},
"aggs" : {
"general" : {
"terms" : {
"field" : "COUNTRYNAME", "size":0
}
}
}}'

结果:

{
"took" : 14,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 45,
"max_score" : 1.0,
"hits" : [{
"_index" : "botanic",
"_type" : "specimens",
"_id" : "91E7B53B61DF4E76BF70C780315A5DFD",
"_score" : 1.0,
"fields" : {
"COUNTRYNAME" : ["Bolivia, Plurinational State of"]
}
}, {
"_index" : "botanic",
"_type" : "specimens",
"_id" : "7D811B5D08FF4F17BA174A3D294B5986",
"_score" : 1.0,
"fields" : {
"COUNTRYNAME" : ["Bolivia, Plurinational State of"]
}
} ...
]
},
"aggregations" : {
"general" : {
"buckets" : [{
"key" : "bolivia, plurinational state of",
"doc_count" : 45
}
]
}
}
}

关于elasticsearch mapping tokenizer 关键字以避免拆分 token 并启用通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26486037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com