【问题标题】:Elasticsearch Suggestions Multi Index and Multi FieldsElasticsearch 建议多索引和多字段
【发布时间】:2021-07-19 14:15:58
【问题描述】:

我有包含不同字段的不同索引。我试图弄清楚如何从所有索引和所有字段中获取建议。我知道使用GET /_all/_search 我可以通过所有索引搜索结果。但是如何从所有索引和所有字段中获取所有建议?因为我想有一个像谷歌“你的意思是:建议”这样的功能 所以,我试了一下:

GET /_all/_search
{
   "query" : {
      "multi_match" : {
         "query" : "berlin"
      }
    },
    "suggest" : {
       "text" : "berlin",
       "my-suggest-1" : {
          "term" : {
             "field" : "street"
          }
       },
       "my-suggest-2" : {
          "term" : {
             "field" : "city"
          }
       },
       "my-suggest-3" : {
          "term" : {
             "field" : "description"
          }
       }
    }
}

“my-suggest-1”和“-2”属于索引地址(见下文),“my-suggest-3”属于索引产品。我收到以下错误:

"error" : {
   "root_cause" : [
      {
         "type" : "illegal_argument_exception",
         "reason" : "no mapping found for field [street]"
      },
      {
         "type" : "illegal_argument_exception",
         "reason" : "no mapping found for field [city]"
      },
      {
         "type" : "illegal_argument_exception",
         "reason" : "no mapping found for field [description]"
      }
   ]
}

但如果我只使用 1 个索引的字段,我会得到建议,请参阅:

GET /_all/_search
{
   "query" : {
      "multi_match" : {
         "query" : "berlin"
      }
    },
    "suggest" : {
       "text" : "berlin",
       "my-suggest-1" : {
          "term" : {
             "field" : "street"
          }
       },
       "my-suggest-2" : {
          "term" : {
             "field" : "city"
          }
       }
    }
}

回应

...
"failures" : {
...
},
"hits" : {
...
}
"suggest" : {
   "my-suggest-1" : [
      {
         "text" : "berlin",
         "offset" : 0,
         "length" : 10,
         "options" : [
            {
               "text" : "berliner",
               "score" : 0.9,
               "freq" : 12
            },
            {
               "text" : "berlinger",
               "score" : 0.9,
               "freq" : 1
            }
         ]
      }
   ],
   "my-suggest-2" : [
      {
         "text" : "berlin",
         "offset" : 0,
         "length" : 10,
         "options" : []
      }
   ]
...

我不知道如何从索引地址和产品中获得建议?如果有人可以帮助我,我会很高兴。

索引 1 - 地址:

"address" : {
  "aliases" : {
     ....
   },
   "mappings" : {
      "dynamic" : "strict",
      "properties" : {
         "_entity_type" : {
            "type" : "keyword",
            "index" : false
         },
         "street" : {
            "type" : "text"
         },
         "city" : {
            "type" : "text"
         }
      }
   },
   "settings" : {
      ...
   }
}

索引 2 - 产品:

"product" : {
  "aliases" : {
     ...
   },
   "mappings" : {
      "dynamic" : "strict",
      "properties" : {
         "_entity_type" : {
            "type" : "keyword",
            "index" : false
         },             
         "description" : {
            "type" : "text"
         }
      }
   },
   "settings" : {
      ...
   }
}

【问题讨论】:

    标签: elasticsearch multi-index search-suggestion


    【解决方案1】:

    您可以在搜索中添加多个索引。在这种情况下,您需要搜索所有索引上存在的字段。因此,在您的情况下,您需要在两个索引中定义所有三个字段。 “街道”和“城市”字段在第一个索引中归档,而“描述”字段仅在第二个索引中填写。这将是您对“地址”索引的映射。在该索引中,“描述”字段存在但没有数据。在第二个索引中,“街道”和“城市”存在但没有数据。

    "address" : {
      "aliases" : {
         ....
       },
       "mappings" : {
          "dynamic" : "strict",
          "properties" : {
             "_entity_type" : {
                "type" : "keyword",
                "index" : false
             },
             "street" : {
                "type" : "text"
             },
             "city" : {
                "type" : "text"
             },
             "description" : {
                "type" : "text"
             }
          }
       },
       "settings" : {
          ...
       }
    }
    

    【讨论】:

    • 它是这样工作的。谢谢你。但我正在寻找另一种解决方案。我所有的索引都应该有一个名为“suggest”字段。并且这个字段应该包含这个索引的所有其他字段(例如地址{street,city,suggest:{street,city}}),并且没有来自其他索引的字段。这怎么可能?
    • 当您想使用通用查询来处理多个索引时,您需要在所有索引上具有相同的字段。我想到的解决方案是您在所有索引中定义建议字段。在所有索引中,使字段具有相同的名称。作为地址索引的示例,您添加了建议:{field1,field2}。在这种情况下,您可以对所有索引上存在的 field1 和 field2 进行查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多