如何构建elasticsearch查询,以使文档字段中的每个标记都匹配?

为了简化起见,这是一个通用示例。

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

  • 这不是使用not_analyzed的选项,因为我确实需要利用分析器功能
  • 我打算使用kstem,自定义同义词,自定义char_filter,小写过滤器以及标准标记器

但是,我需要确保字段的每个标记都匹配

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]

}

}

}

}

}

  • 将[query]替换为搜索字词
  • 将[tokencount]替换为搜索字词中的令牌数量(使用上面的GetTokenCount函数

这样可确保所有匹配项至少与中的令牌数一样多MyField

上面有一些缺点。例如,如果我们匹配字段“ blue red”,并且用户搜索“ blue

blue”,则上面的内容将触发匹配。因此,您可能需要使用唯一的令牌过滤器。您可能还希望调整过滤器,以便

  • 克林顿·戈麦利(Clinton Gormely)启发了解决方案

以上是 如何构建elasticsearch查询,以使文档字段中的每个标记都匹配? 的全部内容, 来源链接: utcz.com/qa/403520.html

回到顶部