Elasticsearch 建议多索引和多字段

问题描述

我有包含不同字段的不同索引。我试图弄清楚如何从所有索引和所有字段中获取建议。我知道使用 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]"
      },"reason" : "no mapping found for field [description]"
      }
   ]
}

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

GET /_all/_search
{
   "query" : {
      "multi_match" : {
         "query" : "berlin"
      }
    },"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","freq" : 1
            }
         ]
      }
   ],"my-suggest-2" : [
      {
         "text" : "berlin","options" : []
      }
   ]
...

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

索引 1 - 地址:

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

索引 2 - 产品:

"product" : {
  "aliases" : {
     ...
   },"description" : {
            "type" : "text"
         }
      }
   },"settings" : {
      ...
   }
}

解决方法

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...