如何在有多个关键字的字段上应用匹配查询,例如“los angeles”中有两个单词。如何从下面的数据结构进行匹配
"addresses" : [
{
"type" : "Home",
"address" : "Los Angeles,CA,US"
}
]
下面是我的Map和设置,创建了自定义设置和过滤器
PUT /test
{
"settings": {
"analysis": {
"filter" : {
"my_word_delimiter" : {
"type" : "word_delimiter",
"type_table": [
"# => ALPHANUM",
"+ => ALPHANUM",
"@ => ALPHANUM",
"% => ALPHANUM",
"~ => ALPHANUM",
"^ => ALPHANUM",
"$ => ALPHANUM",
"& => ALPHANUM",
"' => ALPHANUM",
"\" => ALPHANUM",
"\/ => ALPHANUM",
", => ALPHANUM"
],
"preserve_original": "true",
"generate_word_parts":false,
"generate_number_parts":false,
"split_on_case_change":false,
"split_on_numerics":false,
"stem_english_possessive":false
}
},
"analyzer": {
"default": {
"type": "custom",
"tokenizer": "whitespace",
"filter": [
"lowercase",
"my_word_delimiter"
]
}
},
"normalizer": {
"keyword_lowercase": {
"type": "custom",
"filter": [
"lowercase"
]
}
}
}
},
"mappings": {
"dynamic": "strict",
"properties": {
"addresses": {
"type": "nested",
"properties": {
"address": {
"type": "text"
},
"type": {
"type": "keyword"
}
}
}
}
}
}
尝试了下面的查询,但没有得到结果
{
"from": "0",
"size": "30",
"query": {
"bool": {
"must": [
{
"bool": {
"should": [
{
"nested": {
"path": "addresses",
"query": {
"match": {
"addresses.address": {
"query": "Los Angeles",
"operator": "and"
}
}
}
}
}
]
}
}
]
}
},
"sort": [
{
"_score": {
"order": "desc"
}
}
]
}
创建的设置有问题吗
1条答案
按热度按时间rnmwe5a21#
如果地址的值为
"Los Angeles,CA,US"
,因为您正在使用whitespace
标记器。每当遇到空白字符时,空白标记符就会将文本分解为术语。
既然你用的是
and
操作员match
查询,因此查询应该检索同时具有这两个属性的数据Los
以及Angeles
,但由于空格标记器,没有Angeles
生成,因此不返回任何结果。代币包括:
但在这种情况下
"Los Angeles ,CA,US"
,因为后面有一个空格Angeles
,因此生成的令牌是:Los
,Angeles
,,CA,US
添加索引数据、Map和搜索结果的工作示例索引Map:
保持Map不变,除了从
whitespace
到"tokenizer":"standard"
分析api标准标记器提供基于语法的标记化
代币包括:
索引数据:
使用与结果中给定的相同的搜索查询
搜索结果:
注意:如果您想使用
whitespace
标记器,然后删除"operator": "and"
从搜索查询中,您将得到所需的结果更新1:
尝试使用此更新的Map:
生成\u单词\u部分设置为
true
以便过滤器在输出中包含由字母字符组成的标记。字分隔符标记筛选器,在非字母数字字符处拆分标记。已删除
", => ALPHANUM"
,来自type_table