gpt4 book ai didi

elasticsearch - 使用自定义分析器在Elasticsearch中获取multi_match cross_fields查询的结果

转载 作者:行者123 更新时间:2023-12-03 00:56:25 24 4
gpt4 key购买 nike

我有一个带有产品的 flex 搜索5.3服务器。
每个产品都有一个14位产品代码,必须通过以下规则进行搜索。完整的代码以及仅包含最后9位,最后6位,最后5位或最后4位的搜索字词都应匹配。

为了实现这一目标,我创建了一个自定义分析器,该分析器在索引时间使用模式捕获 token 过滤器创建了适当的 token 。这似乎工作正常。 _analyse API显示已创建正确的术语。

为了从 flex 搜索中获取文档,我使用了multi_match cross_fields bool查询来同时搜索多个字段。

当我有一个查询字符串,该字符串的一部分与产品代码匹配,而一部分与任何其他字段匹配时,则不会返回任何结果,但是当我分别搜索每个部分时,会返回相应的结果。另外,当我有多个部分跨越除产品代码以外的任何字段时,都会返回正确的结果。

我的 map 和分析器:

PUT /store
{
"mappings": {
"products":{
"properties":{
"productCode":{
"analyzer": "ProductCode",
"search_analyzer": "standard",
"type": "text"
},
"description": {
"type": "text"
},
"remarks": {
"type": "text"
}
}
}
},
"settings": {
"analysis": {
"filter": {
"ProductCodeNGram": {
"type": "pattern_capture",
"preserve_original": "true",
"patterns": [
"\\d{5}(\\d{9})",
"\\d{8}(\\d{6})",
"\\d{9}(\\d{5})",
"\\d{10}(\\d{4})"
]
}
},
"analyzer": {
"ProductCode": {
"filter": ["ProductCodeNGram"],
"type": "custom",
"preserve_original": "true",
"tokenizer": "standard"
}
}
}
}
}

查询
GET /store/products/_search
{
"query": {
"bool": {
"must": [
{
"multi_match": {
"query": "[query_string]",
"fields": ["productCode", "description", "remarks"],
"type": "cross_fields",
"operator": "and"
}
}
]
}
}
}

样本数据
POST /store/products
{
"productCode": "999999123456789",
"description": "Foo bar",
"remarks": "Foobar"
}

以下查询字符串均返回一个结果:

“456789”,“foo”,“foobar”,“foo foobar”。

但是query_string“foo 456789”没有返回结果。

我很好奇为什么最后一次搜索没有返回任何结果。我坚信应该这样做。

最佳答案

问题在于您正在对具有不同分析器的字段进行cross_fields。交叉字段仅适用于使用同一分析器的字段。实际上,它会在进行交叉字段之前按分析器对字段进行分组。您可以在本文档中找到更多信息。

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html#_literal_cross_field_literal_and_analysis

关于elasticsearch - 使用自定义分析器在Elasticsearch中获取multi_match cross_fields查询的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43494397/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com