我们的系统按以下格式存储帐户:acct:username@domain
但对于许多搜索我们只需要用户名,因此对于用户创建的备忘录,我决定将用户字段设为multi_field
,如下所示:
{
'text': {
'type': 'string'
}
'user': {
'type': 'multi_field',
'path': 'just_name',
'fields': {
'user': {
'type': 'string',
'index': 'analyzed',
'analyzer': 'lower_keyword'
},
'username': {
'type': 'string',
'index': 'analyzed',
'analyzer': 'username'
}
}
}
}
和其他设置:
__settings__ = {
'analysis': {
'tokenizer': {
'username': {
'type': 'pattern',
'group': 1,
'pattern': '^acct:(.+)@.*$'
}
},
'analyzer': {
'lower_keyword': {
'type': 'custom',
'tokenizer': 'keyword',
'filter': 'lowercase'
},
'username': {
'tokenizer': 'username',
'filter': 'lowercase'
}
}
}
}
现在,如果我查询其工作的用户名。即如果我有以下用户:acct:testuser@testdomain
我做了这样的查询:
{
"query": {
"bool": {
"must": [
{
"terms": {
"username": [
"testuser"
]
}
}
],
"minimum_number_should_match": 1
}
},
"size": 50
}
它有效(我知道它可以更轻松地完成,但这是一个系统生成的查询)。
但是,我需要进行搜索,在文本和用户名字段中查找字符串。
我决定使用multi-match
查询。
{
"query": {
"bool": {
"must": [
{
"multi_match": {
"operator": "and",
"query": "testuser",
"type": "cross_fields",
"fields": [
"text",
"username"
]
}
}
],
"minimum_number_should_match": 1
}
},
"size": 50
}
现在的问题是,此查询不适用于用户名字段。它适用于文本字段,如果我包含它们,则适用于其他字段,但不会返回用户名字段的任何结果。
你能帮我解决我做错的事吗?
答案 0 :(得分:0)
我忘记了用户名分析器也会将我的搜索标记为匹配/多重匹配查询。这样就分析了字符串'testuser',它生成了零令牌。
因此,解决方案是将用户名的字段映射更改为:
'username': {
'type': 'string',
'index': 'analyzed',
'index_analyzer': 'username',
'search_analyzer': 'lower_keyword'
}
现在两个查询都在运行。