如何明智地将shingles和edgeNgram结合使用以提供灵活的全文本搜索?

如何明智地将shingles和edgeNgram结合使用以提供灵活的全文本搜索?,第1张

如何明智地将shingles和edgeNgram结合使用以提供灵活的全文本搜索?

这是一个有趣的用例。这是我的看法:

{  "settings": {    "analysis": {      "analyzer": {        "my_ngram_analyzer": {          "tokenizer": "my_ngram_tokenizer",          "filter": ["lowercase"]        },        "my_edge_ngram_analyzer": {          "tokenizer": "my_edge_ngram_tokenizer",          "filter": ["lowercase"]        },        "my_reverse_edge_ngram_analyzer": {          "tokenizer": "keyword",          "filter" : ["lowercase","reverse","substring","reverse"]        },        "lowercase_keyword": {          "type": "custom",          "filter": ["lowercase"],          "tokenizer": "keyword"        }      },      "tokenizer": {        "my_ngram_tokenizer": {          "type": "nGram",          "min_gram": "2",          "max_gram": "25"        },        "my_edge_ngram_tokenizer": {          "type": "edgeNGram",          "min_gram": "2",          "max_gram": "25"        }      },      "filter": {        "substring": {          "type": "edgeNGram",          "min_gram": 2,          "max_gram": 25        }      }    }  },  "mappings": {    "test_type": {      "properties": {        "text": {          "type": "string",          "analyzer": "my_ngram_analyzer",          "fields": { "starts_with": {   "type": "string",   "analyzer": "my_edge_ngram_analyzer" }, "ends_with": {   "type": "string",   "analyzer": "my_reverse_edge_ngram_analyzer" }, "exact_case_insensitive_match": {   "type": "string",   "analyzer": "lowercase_keyword" }          }        }      }    }  }}
  • my_ngram_analyzer
    用于将每个文本分成小块,块的大小取决于您的用例。我出于测试目的选择了25个字符。
    lowercase
    因为您说不区分大小写,所以使用了。基本上,这是用于的标记器
    substringof('table 1',name)
    查询很简单:
    {      "query": {        "term": {          "text": { "value": "table 1"          }        }      }    }
  • my_edge_ngram_analyzer
    用于从头开始拆分文本,这专门用于
    startswith(name,'table 1')
    用例。同样,查询很简单:
    {      "query": {        "term": {          "text.starts_with": { "value": "table 1"          }        }      }    }
  • 我发现这是最棘手的部分-用于
    endswith(name,'table1')
    。为此,我定义
    my_reverse_edge_ngram_analyzer
    了将分
    keyword
    词器与
    lowercase
    edgeNGram
    过滤器一起使用的过滤
    reverse
    器。该标记器的基本作用是将文本拆分为edgeNGrams,但edge是文本的结尾,而不是开始(就像常规一样
    edgeNGram
    )。查询:
    {      "query": {        "term": {          "text.ends_with": { "value": "table 1"          }        }      }    }
  • 对于这种
    name eq 'table1'
    情况,应使用简单的
    keyword
    标记
    lowercase
    器和过滤器来执行查询:
    {      "query": {        "term": {          "text.exact_case_insensitive_match": { "value": "table 1"          }        }      }    }

关于

query_string
,这稍微改变了解决方案,因为我指望
term
不分析输入文本,并使其与索引中的术语之一完全匹配。

但是,

query_string

如果
analyzer
为其指定了适当的位置,则可以“模拟” 。

解决方案将是一组类似以下的查询(始终使用该分析器,仅更改字段名称):

    {      "query": {        "query_string": {          "query": "text.starts_with:("table 1")",          "analyzer": "lowercase_keyword"        }      }    }


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4937298.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-13
下一篇 2022-11-13

发表评论

登录后才能评论

评论列表(0条)

保存