我需要确保在用户搜索中,字段的每个标记至少与一个标记匹配。
为了简化起见,这是一个通用示例。
让 Store_Name = "Square Steakhouse"
Store_Name = "Square Steakhouse"
当用户搜索Square或Steakhouse时,构建与该文档匹配的查询很简单。此外,在默认分析仪上附加了kstem过滤器后,牛排餐厅也很可能会匹配。
{ "size": 30, "query": { "match": { "Store_Name": { "query": "Square", "operator": "AND" } } } }
不幸的是,我需要匹配Store_Name字段的每个标记。我需要以下行为:
Query: Square Steakhouse Result: Match Query: Square Steakhouses Result: Match Query: Squared Steakhouse Result: Match Query: Square Result: No Match Query: Steakhouse Result: No Match
综上所述
但是,我需要确保字段的每个标记都匹配
elasticsearch有可能吗?
这是个好方法。
它不是完美的,但是在简单性,计算和存储方面是一个很好的折衷。
您将需要使用分析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的映射中有一个条目
这是一个很好的elasticsearch查询,用于利用此新令牌计数信息:
{ "size": 30, "query": { "filtered": { "query": { "match": { "MyField": { "query": "[query]", "operator": "AND" } } }, "filter": { "term": { "TokenCount": [tokencount] } } } } }
这样可确保所有匹配项至少与中的令牌数一样多MyField。
MyField
上面有一些缺点。例如,如果我们匹配字段“ blue red”,并且用户搜索“ blue blue”,则上面的内容将触发匹配。因此,您可能需要使用唯一的令牌过滤器。您可能还希望调整过滤器,以便
参考