这是一个有趣的用例。这是我的看法:
{ "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" } } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)