【发布时间】:2016-12-15 10:22:03
【问题描述】:
我正在尝试为最终用户提供搜索时使用的类型,这更像是 sqlserver。我能够为给定的 sql 场景实现 ES 查询:
select * from table where name like '%peter tom%' and type != 'xyz
在 ES 中,我使用 ngram tokenizer 来达到预期的效果:
PUT sample
{
"settings": {
"analysis": {
"analyzer": {
"my_ngram_analyzer": {
"tokenizer": "my_ngram_tokenizer"
}
},
"tokenizer": {
"my_ngram_tokenizer": {
"type": "nGram",
"min_gram": "2",
"max_gram": "15"
}
}
}
},
"mappings": {
"typename": {
"properties": {
"name": {
"type": "string",
"fields": {
"search": {
"type": "string",
"analyzer": "my_ngram_analyzer"
}
}
},
"type": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
{
"query": {
"bool": {
"should": [
{
"term": {
"name.search": "peter tom"
}
}
],
"must_not": [
{
"match": {
"type": "xyz"
}
},
{
"match": {
"type": "abc"
}
}
]
}
}
}
所以如果我的文档行是这样的
name type
peter tomson efg
Peter tomson robert simson efg
上面的查询只显示了两个文档,但是当我尝试输入 Peter sims 或 Peter simson 时,它不会返回第二个文档,除非我输入 Peter tomson robert sims 或 Peter tomson robert simson。所以基本上我必须输入Peter 之后和 simson 之前的所有以下单词都可以到达第二个文档。有什么方法可以让第二个文档进行部分匹配。我可以使用查询匹配和“AND”操作,但这仍然是单词的完全匹配。我正在寻找像 Peter sims 这样的部分匹配应该给我第二行的文件。 谢谢
【问题讨论】:
标签: elasticsearch