Elasticsearch cross_field所有术语必须至少存在于字段中

时间:2014-07-09 16:19:36

标签: search elasticsearch full-text-search

我想构建一个Elasticsearch查询,我查询多个字段,所有字段必须出现在至少一个字段中。我对multi_match使用cross_field查询。 Elascticsearch documentation

例如:

我的搜索结束了以下用户对象:

{ firstname: '...', lastname: '...', email: '...' }

我们有2位用户:

{
  firstname: 'Delphine',
  lastname: 'Dorémi',
  email: 'tyrell@interne.fr'
}

{
  firstname: 'Philippe',
  lastname: 'Mifasol',
  email: 'roybatty@interne.com'
}

查询:“Rachel Mifasol”

我想要的结果:没有结果(因为“Philippe”用户对象中缺少“Rachel”)

Elasticsearch实际给我的结果:“Philippe”(我想因为“Mifasol”匹配......)

这是我的Elasticsearch查询:

query: {
  multi_match: {
    query: 'Rachel Mifasol',
    type: 'cross_fields',
    fields: ['firstname', 'lastname', 'emails'],
    operator: 'and'
  }
}

这是我的分析器和映射:

settings: {
  analysis: {
    filter: {
      nGram_filter: {
        type: 'nGram',
          min_gram: 2,
          max_gram: 20,
          token_chars: [
          'letter',
          'digit',
          'punctuation',
          'symbol'
        ]
      }
    },
    analyzer: {
      nGram_analyzer: {
        type: 'custom',
          tokenizer: 'whitespace',
          filter: [
          'lowercase',
          'asciifolding',
          'nGram_filter'
        ]
      },
      whitespace_analyzer: {
        type: 'custom',
          tokenizer: 'whitespace',
          filter: [
          'lowercase',
          'asciifolding'
        ]
      }
    }
  }
},
mappings: {
  users: {
    properties: {
      firstname: {
        type: 'string',
          index_analyzer: 'nGram_analyzer',
          search_analyzer: 'whitespace_analyzer',
          fields: {
          sort: {
            type: 'string',
            index: 'not_analyzed'
          }
        }
      },
      lastname: {
        type: 'string',
          index_analyzer: 'nGram_analyzer',
          search_analyzer: 'whitespace_analyzer'
      },
      emails: {
        type: 'string',
          index_analyzer: 'nGram_analyzer',
          search_analyzer: 'whitespace_analyzer'
      }
    }
  }
}

0 个答案:

没有答案