乐闻世界logo
搜索文章和话题

Elasticsearch how to use multi_match with wildcard

4 个月前提问
3 个月前修改
浏览次数14

1个答案

1

在Elasticsearch中,multi_match 查询是用来在多个字段上执行相同的查询的一个非常有用的功能。如果您希望在这种查询中使用通配符,您可以通过多种方式实现,但需要注意,直接在multi_match查询中使用通配符可能不会直接支持。然而,您可以使用query_string查询来达到类似multi_match的效果并同时支持通配符。下面我将通过一个具体的例子来解释如何实现。

假设我们有一个索引,包含有关书籍的文档,每个文档都有titledescription两个字段。现在,如果我们想要查找标题或描述中包含类似"comp*"(代表"computer", "companion", "complex"等等)的书籍,我们可以使用query_string查询来实现这种带通配符的搜索,覆盖多个字段。

示例

假设我们的索引名为books。我们可以构造如下的查询:

json
GET /books/_search { "query": { "query_string": { "query": "(title:comp* OR description:comp*)", "fields": ["title", "description"] } } }

在这个查询中:

  • query_string 允许我们在query参数中直接使用Lucene查询语法,这包括通配符如*
  • 我们使用(title:comp* OR description:comp*)来指定我们在titledescription字段中查找任何以"comp"开头的词。
  • fields 参数显式指明我们要搜索的字段。

注意事项

使用通配符和query_string查询时,需要小心,因为这可能会导致查询效率下降,尤其是当通配符查询部分涉及到大量的词条匹配时。此外,通配符查询如果放在词的开头,如*comp,可能会导致性能问题,因为这种类型的查询通常会扫描索引中的每个词条。

总之,尽管multi_match查询本身不直接支持通配符,但通过使用query_string查询,您可以在多个字段上实现通配符搜索的需求,同时保持查询的灵活性和强大功能。在实用中,建议根据数据的具体情况和需求,谨慎选择并优化查询方式。

2024年6月29日 12:07 回复

你的答案