弹性搜索具有multi_match和bool_prefix类型的模糊性



我有一组需要搜索的search_as_you_type_fields。这是我的地图

"mappings" : {
"properties" : {
"description" : {
"type" : "search_as_you_type",
"doc_values" : false,
"max_shingle_size" : 3
},
"questions" : {
"properties" : {
"content" : {
"type" : "search_as_you_type",
"doc_values" : false,
"max_shingle_size" : 3
},
"tags" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword"
}
}
}
}
},

"title" : {
"type" : "search_as_you_type",
"doc_values" : false,
"max_shingle_size" : 3
},
}
}

我使用的是bool_prefix类型的multi_match查询。

"query": {
"multi_match": {
"query": "triangle", 
"type": "bool_prefix",
"fields": [
"title",
"title._2gram",
"title._3gram",
"description",
"description._2gram",
"description._3gram",
"questions.content",
"questions.content._2gram",
"questions.content._3gram",
"questions.tags",
"questions.tags._2gram",
"questions.tags._3gram"
]
}
}

到目前为止效果良好。现在我想在ES中添加一个拼写错误容忍度,即模糊性。然而,看起来bool_prefix在处理这个问题时有一些冲突。因此,如果我修改我的查询并添加";模糊性":"AUTO";并在单词"中出错;三角形"->quot;三角形";,它不会有任何结果。

然而,如果我正在寻找一个短语";"直角三角形";,我有一些不同的行为:

  1. 即使没有错别字,我也只得到了更多的结果;模糊性":"AUTO";(1759对1267(
  2. 如果我在2d单词";右三角形";,它似乎起了作用,但看起来它现在推送的结果包含";右";没有";三角形";首先("权利法案"、"正当程序和隐私权"等(
  3. 如果我在第一个单词("righd triangle"(或两者("righdtriangdd"(中拼写错误,结果似乎很好。所以这可能是唯一正确的行为

我看到过几篇文章,甚至GitHub的问题,即模糊性在带有bool_prefix的multi_match查询中无法正常工作,但我找不到解决方法。我已经尝试更改查询类型,但看起来bool_prefix是唯一一个支持在键入时进行搜索的查询类型,并且我需要在用户开始键入内容时获得搜索结果。

由于我从后台从ES发出所有请求,如果需要,我还可以操作查询字符串来构建不同的搜索查询类型。例如,对于1个单词的搜索,使用一种类型进行多用途搜索。但我基本上需要保持目前的行为。

我还试着添加一个标志"~"或"~1[2]";这似乎是指定模糊性的另一种方式,但结果相当不清楚,性能(搜索速度(似乎更差。

我的问题是:

  1. 如何实现1个单词搜索的模糊性?使得查询";三角形;返回包含";三角形";等等
  2. 当查询的2d(最后一个?(单词出现拼写错误时,我如何获得正确的搜索结果?就像我上面提到的那样,它是有效的,但请参阅上面的第2点
  3. 为什么仅仅添加模糊性(见第1页(即使短语是正确的,也会返回更多的结果
  4. 我的分析仪等有什么需要更改的吗

因此,为了实现所需的行为,我们执行了以下操作:

  1. 将查询类型更改为";query_string">
  2. 在后台添加了查询字符串预处理。我们用空格分割查询字符串~1〃;或"~2〃;如果每个单词的长度分别超过4个字符或8个字符,则添加到每个单词。~是ES中的模糊语法。但是,在用户键入空白之前,我们不会将其添加到当前键入的单词中。例如,用户键入[t,tr,tri,…triangle]=>没有模糊,但是一次";三角形"=>quot;三角形~2";。这是因为最后一个单词具有模糊性会产生意想不到的结果
  3. 我们还从搜索字段中删除了所有ngram字段,因为我们得到了相同的结果,但性能要好一点
  4. 添加";default_operator":"与";到查询以包含短语查询的一个字段的结果

最新更新