ElasticSearch搜索可能有错别字的关键字列表

bejyjqdl  于 2023-10-17  发布在  ElasticSearch
关注(0)|答案(1)|浏览(124)

ElasticSearch索引中搜索包含大文本的字段中的某些关键字的最佳方法是什么?
我想在一个名为my_field的字段中搜索一些单词,并使用以下约束:

  • 我可以将单词列表作为单独的元素传递,也可以将单词列表作为一个带有空格的字符串传递,重要的是每个单词都被搜索
    *这些单词可能包含错别字,也可能以不同的方式书写,例如OpenAI可以写成open aiopenai(以小写字母)。我想搜索所有这些组合,但优先考虑与精确匹配的结果

我们来举个例子吧。我的话是:

  • 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的变化,并查看包含完美可能组合的文档的优先级?

tkqqtvp1

tkqqtvp11#

我将索引my_field两次,一次是按原样,然后第二次,我将首先分裂的情况下,但然后合并字在二元组使用瓦片过滤器。在搜索中,我会搜索原始字段和bigrams字段,使原始字段更高的提升。
有不同的方法来做到这一点,这取决于你想要多少单词混合在一起来匹配增强级别等,但希望这个例子能让你开始:

DELETE my_index
PUT my_index
{
  "settings": {
    "analysis": {
      "filter": {
        "tuples_index": {
          "type": "shingle",
          "min_shingle_size": 2,
          "max_shingle_size": 2,
          "output_unigrams": false,
          "token_separator": ""
        },
        "tuples_search": {
          "type": "shingle",
          "min_shingle_size": 2,
          "max_shingle_size": 2,
          "output_unigrams": true,
          "token_separator": ""
        }
      }, 
      "analyzer": {
        "standard_shingle_index": {
          "tokenizer": "standard",
          "filter": [ "word_delimiter", "lowercase", "tuples_index" ]
        },
        "standard_shingle_search": {
          "tokenizer": "standard",
          "filter": [ "word_delimiter", "lowercase", "tuples_search" ]
        }
      }
    }
  }, 
  "mappings": {
    "properties": {
      "my_field": {
        "type": "text",
        "fields": {
          "tuples": {
            "type": "text",
            "analyzer": "standard_shingle_index",
            "search_analyzer": "standard_shingle_search"
          }
        }
      }
    }
  }
}

PUT my_index/_bulk?refresh
{"index": {}}
{"my_field": "Mira Murati (born 1988) is a United States-based, Albanian-born engineer, researcher and business executive. She is currently the chief technology officer of OpenAI, the artificial intelligence research company that develops ChatGPT." }
{"index": {}}
{"my_field": "Women You Should Know: Mira Murati, CTO of Open A.I." }

GET my_index/_validate/query?explain

GET my_index/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "my_field": {
              "query": "OpenAI",
              "boost": 2
            }
          }
        },
        {
          "match": {
            "my_field.tuples": {
              "query": "OpenAI"
            }
          }
        }
      ]
    }
  }
}

GET my_index/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "my_field": {
              "query": "Open AI",
              "boost": 2
            }
          }
        },
        {
          "match": {
            "my_field.tuples": {
              "query": "Open AI"
            }
          }
        }
      ]
    }
  }
}

相关问题