这里有一个好方法。
它并不完美,但在简单性、计算和存储方面是一个很好的折衷。
- 索引该字段的标记计数
- 获取搜索文本的 token 计数
- 执行过滤查询并强制结果之间的标记数量相等
您将需要使用分析 API 来获取令牌计数。确保使用与相关字段相同的分析仪。下面是一个获取令牌计数的 VB.NET 函数:
Private Function GetTokenCount(ByVal RawString As String, Optional ByVal Analyzer As String = "default") As Integer
If Trim(RawString) = "" Then Return 0
Dim client = New ElasticConnection()
Dim result = client.Post("http://localhost:9200/myindex/_analyze?analyzer=" & Analyzer, RawString) 'Submit analyze request usign PlainElastic.NET API
Dim J = JObject.Parse(result.ToString()) 'Populate JSON.NET JObject
Return (From X In J("tokens")).Count() 'returns token count using a JSON.NET JObject
End Function
您将希望在索引时使用它来存储相关字段的标记计数。确保映射中有 TokenCount 的条目
这是一个很好的弹性搜索查询,用于利用这个新的令牌计数信息:
{
"size": 30,
"query": {
"filtered": {
"query": {
"match": {
"MyField": {
"query": "[query]",
"operator": "AND"
}
}
},
"filter": {
"term": {
"TokenCount": [tokencount]
}
}
}
}
}
- 将 [query] 替换为搜索词
- 将 [tokencount] 替换为搜索词中的标记数量(使用上面的 GetTokenCount 函数
这确保了所有匹配项至少与中的标记一样多MyField
.
上述方法也有一些缺点。例如,如果我们正在匹配字段“blue red”,并且用户搜索“blue blue”,则以上将触发匹配。所以,您可能想使用独特的令牌过滤器 http://www.elasticsearch.org/guide/reference/index-modules/analysis/unique-tokenfilter.html。您可能还希望调整过滤器,以便
参考
- 克林顿·戈梅利提出了解决方案 https://groups.google.com/forum/?fromgroups=#!topic/elasticsearch/ttJTE52hXf8