在多字段中使用多匹配查询不起作用

时间:2014-08-27 09:21:57

标签: elasticsearch

我们的系统按以下格式存储帐户: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
}

现在的问题是,此查询不适用于用户名字段。它适用于文本字段,如果我包含它们,则适用于其他字段,但不会返回用户名字段的任何结果。

你能帮我解决我做错的事吗?

1 个答案:

答案 0 :(得分:0)

我忘记了用户名分析器也会将我的搜索标记为匹配/多重匹配查询。这样就分析了字符串'testuser',它生成了零令牌。

因此,解决方案是将用户名的字段映射更改为:

'username': {
    'type': 'string',
    'index': 'analyzed',
    'index_analyzer': 'username',
    'search_analyzer': 'lower_keyword'
}

现在两个查询都在运行。