我正在构建一个业务搜索引擎,以根据用户输入的查询来搜索业务联系方式。用于企业的信息以以下形式存储在Elasticsearch索引中:
"_source" : {
"id" : 53,
"name" : "Judge Pouros",
"email" : "roob.alberto@example.com",
"phone" : "+1-783-850-2127",
"created_at" : "02/10/2019 16:30",
"updated_at" : "02/10/2019 16:30",
"travel_agencies" : [
{
"id" : 1234,
"abta" : "A1234",
"name" : "The Example Travel Agency",
"address_id" : 27,
"email" : "zwillms@example.info",
"comm_rate" : 14.0,
"travel_agency_type_id" : 1,
"address" : {
"id" : 27,
"line_1" : "Flat 52",
"line_2" : "Flat 82i\nKaren Circles",
"town" : "Kimberlyside",
"county" : "Renfrewshire",
"country_id" : 189,
"postcode" : "SM3 9QR",
"created_at" : "2019-10-02 16:31:01",
"updated_at" : "2019-10-02 16:31:01",
"country" : {
"id" : 189,
"code" : "MF",
"name" : "Saint Martin (French part)",
"translations" : [
{
"id" : 189,
"locale" : "en",
"country_id" : 189,
"name" : "Saint Martin (French part)"
}
]
}
}
}
假设某客户正在搜索“示例旅行伦弗鲁郡”。我希望以上结果会返回。我目前正在使用以下查询字符串:
{
"query": {
"query_string": {
"query": "*example*travel*renfrewshire*"
}
}
}
但是没有返回结果。我想做的是查找包含用户查询中的术语且模糊不清的文档,以防拼写错误。
我曾经考虑过对特定术语进行模糊匹配,但是我不知道用户查询的术语可能匹配,因此我需要对照所有术语进行检查。
是否有一个更简单的查询可以做到这一点?
答案 0 :(得分:2)
由于您要搜索整个文档,因此建议使用multi match query。
这将在提供的字段上执行全文搜索。
您的查询将如下所示:
{
"query": {
"multi_match" : {
"query" : "example travel renfrewshire",
"fields" : [ * ]
}
}
}
您还可以在match / multi_match查询中定义模糊性。
编辑:
如文档中所述:
如果未提供任何字段,则multi_match查询默认为index.query.default_field索引设置,而默认设置为*。 *提取映射中符合词条查询条件的所有字段,并过滤元数据字段。然后将所有提取的字段组合起来以构建查询。
您甚至不必定义字段设置,因为它的默认值为*(均符合条件)。