如何解决如何在弹性搜索中指定的所有字段中搜索所有字段?
我是弹性搜索的新手,我该如何编写一个查询来在文档的所有字段中搜索关键字(即测试关键字),又如何编写一个在特定字段中搜索的关键字。
这可以使用query_string
完成,但是我们无法在指定了嵌套字段的嵌套字段中进行搜索,因此我正在使用 LUQUM 将Lucene查询转换为Elasticsearch DSL。 / p>
以下是示例用例:
我有一个映射:
"mappings": {
"properties": {
"grocery_name":{
"type": "text"
},"items": {
"type": "nested","properties": {
"name": {
"type": "text"
},"stock": {
"type": "integer"
},"category": {
"type": "text"
}
}
}
}
}
}
数据如下所示
{
"grocery_name": "Elastic Eats","items": [
{
"name": "Red banana","stock": "12","category": "fruit"
},{
"name": "Cavendish banana","stock": "10",{
"name": "peach",{
"name": "carrot","stock": "9","category": "vegetable"
},{
"name": "broccoli","stock": "5","category": "vegetable"
}
]
}
我如何从 grocery_name:Elastic Eats 来查询以获取名称与 banana 相匹配的所有物品?
尝试了*
和_all
,但无效。
示例查询:
{
"query": {
"bool": {
"must": [
{
"match_phrase": {
"grocery_name": {
"query": "Elastic Eats"
}
}
},{
"match": {
"*": {
"query": "banana","zero_terms_query": "all"
}
}
}
]
}
}
}
我敢肯定我遗漏了一些明显的东西,但是我已经阅读了手册,一点都没有高兴。
更新:
为嵌套对象启用include_in_parent
可以在以下查询中使用,但是它将在内部复制数据,这肯定会影响内存。
{
"query": {
"bool": {
"must": [
{
"match_phrase": {
"grocery_name": {
"query": "Elastic Eats"
}
}
},{
"multi_match": {
"query": "banana"
}
}
]
}
}
}
还有其他方法吗?
解决方法
您需要将nested match query与inner_hits一起使用,以产生内部嵌套查询来自动匹配相关的嵌套级别,而不是根
搜索查询
{
"query": {
"bool": {
"filter": [
{
"term": {
"grocery_name": "elastic"
}
},{
"nested": {
"path": "items","query": {
"bool": {
"must": [
{
"match": {
"items.name": "banana"
}
}
]
}
},"inner_hits": {}
}
}
]
}
}
}
搜索结果:
"inner_hits": {
"items": {
"hits": {
"total": {
"value": 2,"relation": "eq"
},"max_score": 0.744874,"hits": [
{
"_index": "stof_64273970","_type": "_doc","_id": "1","_nested": {
"field": "items","offset": 0
},"_score": 0.744874,"_source": {
"name": "Red banana","stock": "12","category": "fruit"
}
},{
"_index": "stof_64273970","offset": 1
},"_source": {
"name": "Cavendish banana","stock": "10","category": "fruit"
}
}
]
}
更新1:
根据您的评论,您可以针对自己的用例使用多重匹配查询
如果未提供任何字段,则multi_match查询默认为 index.query.default_field索引设置,其默认为*。
(*)提取映射中符合条件查询的所有字段,并过滤元数据字段。然后提取所有字段 结合以建立查询。
搜索查询:
{
"query": {
"bool": {
"filter": [
{
"term": {
"grocery_name": "elastic"
}
},{
"nested": {
"path": "items","query": {
"bool": {
"must": [
{
"multi_match": {
"query": "banana" <-- note this
}
}
]
}
},"inner_hits": {}
}
}
]
}
}
}
更新2:
您需要使用多个布尔查询的组合,如下所示:
{
"query": {
"bool": {
"must": [
{
"match_phrase": {
"grocery_name": {
"query": "Elastic Eats"
}
}
},{
"bool": {
"should": [
{
"bool": {
"must": [
{
"multi_match": {
"query": "banana"
}
}
]
}
},{
"bool": {
"must": [
{
"nested": {
"path": "items","query": {
"bool": {
"must": [
{
"multi_match": {
"query": "banana"
}
}
]
}
},"inner_hits": {}
}
}
]
}
}
]
}
}
]
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。