在ElasticSearch索引中搜索包含大文本的字段中的某些关键字的最佳方法是什么?
我想在一个名为my_field
的字段中搜索一些单词,并使用以下约束:
- 我可以将单词列表作为单独的元素传递,也可以将单词列表作为一个带有空格的字符串传递,重要的是每个单词都被搜索
*这些单词可能包含错别字,也可能以不同的方式书写,例如OpenAI可以写成open ai
或openai
(以小写字母)。我想搜索所有这些组合,但优先考虑与精确匹配的结果。
我们来举个例子吧。我的话是:
cto
open
ai
所以我可以把它们分开,或者像字符串"cto open ai"
一样对待,在谷歌搜索引擎中。这些词也可以是:
cto
openai
因为它们来自一种算法,该算法从文本中提取关键字,并且可以将独特的关键字拆分为2个“常见”字或不。
我想要作为第一个结果的文档有一个my_field
,它包含一个长文本,其中:".....cto.....open ai..."
。所以我尝试使用match
查询,因为我读到有fuzziness
参数来控制Levenshtein距离。
通过这两个查询,找到了结果:
查询ok 1(future 0
,3项):否
GET my_index/_search
{
"query": {
"bool": {
"should": [
{ "match": { "my_field": { "query": "cto", "fuzziness": "0" }}},
{ "match": { "my_field": { "query": "open", "fuzziness": "0" }}},
{ "match": { "my_field": { "query": "ai", "fuzziness": "0" }}}
],
"minimum_should_match" : 1
}
}
}
查询ok 2(future 0
带1个字符串):否
GET my_index/_search
{
"query": {
"bool": {
"should": [
{ "match": { "my_field": { "query": "cto open ai", "fuzziness": "0" }}}
],
"minimum_should_match" : 1
}
}
}
(even如果我改变query
中单词的顺序)。
但我想找到相同的结果,即使:
- 文本包含
open ai
- 我的查询有
openai
,因为它是一个小的变化/错字。
所以我试着:
查询错误3(future AUTO
有2个术语和错别字):错误
GET my_index/_search
{
"query": {
"bool": {
"should": [
{ "match": { "my_field": { "query": "cto", "fuzziness": "AUTO" }}},
{ "match": { "my_field": { "query": "openai", "fuzziness": "AUTO" }}}
],
"minimum_should_match" : 1
}
}
}
但它会在它之前找到其他结果,奇怪的是,如果我使用与案例1相同的查询,但用AUTO
代替0
,它会找到之前的其他文档,这些文档可能只有my_field
中的1/3个单词,而不是所有的3个单词。虽然我知道1个文档包含了所有的3个单词,所以我不明白为什么这不是优先级:
查询错误4(future AUTO
使用之前0
可用的3个原始术语):错误
GET my_index/_search
{
"query": {
"bool": {
"should": [
{ "match": { "my_field": { "query": "cto", "fuzziness": "AUTO" }}},
{ "match": { "my_field": { "query": "open", "fuzziness": "AUTO" }}},
{ "match": { "my_field": { "query": "ai", "fuzziness": "AUTO" }}}
],
"minimum_should_match" : 1
}
}
}
我也尝试了一种混合的方法,给一个boost
的匹配没有"fuzziness"="AUTO"
,但没有运气:
查询错误5(2个术语和错别字的混合模糊):错误
GET my_index/_search
{
"query": {
"bool": {
"should": [
{ "match": { "my_field": { "query": "cto", "boost": 10 }}},
{ "match": { "my_field": { "query": "openai", "boost": 10 }}},
{ "match": { "my_field": { "query": "cto", "fuzziness": "AUTO" }}},
{ "match": { "my_field": { "query": "openai", "fuzziness": "AUTO" }}}
],
"minimum_should_match" : 1
}
}
}
那么,我如何才能使查询灵活地适应所有这些错别字/litlle的变化,并查看包含完美可能组合的文档的优先级?
1条答案
按热度按时间tkqqtvp11#
我将索引my_field两次,一次是按原样,然后第二次,我将首先分裂的情况下,但然后合并字在二元组使用瓦片过滤器。在搜索中,我会搜索原始字段和bigrams字段,使原始字段更高的提升。
有不同的方法来做到这一点,这取决于你想要多少单词混合在一起来匹配增强级别等,但希望这个例子能让你开始: