当前位置: 首页 > 知识库问答 >
问题:

elasticsearch标记facet术语

史景铄
2023-03-14

我正在使用elasticsearch根据类别页面上的某些标准筛选产品。一种选择是由制造商过滤。用户可以选择制造商名称并获得筛选的ResultSet。我的问题是,尽管映射被定义为“not_analysis”,elasticsearch似乎标记了facet术语。

请参见以下示例:

我的映射如下所示:

POST /products_test/product
{
    "mappings" : {
        "product":{
            "properties":{
                "manufacturer": {
                    "type" : "string",
                    "index" : "not_analyzed"
                }
            }
        }
    }
}

以下是我的测试数据:

POST /products_test/product/1
{
    "id": 1,
    "manufacturer": "bra"
}

POST /products_test/product/2
{
    "id": 2,
    "manufacturer": "abracada bra"
}

如果我执行下面的查询,我将得到一个命中,但两个方面的术语:

POST /products_test/_search
{
   "query": {
      "filtered": {
         "query": {
            "match_all": {}
         },
         "filter": {
          "term": {
             "manufacturer": "abracada"
          }
         }
      }
   },
   "facets": {
      "f_manufacturer": {
         "terms": {
            "field": "manufacturer",
            "size": 30,
            "order": "term",
            "all_terms": false
         }
      }
   }
}

结果:

   "facets": {
      "f_manufacturer": {
         "_type": "terms",
         "missing": 0,
         "total": 2,
         "other": 0,
         "terms": [
            {
               "term": "abracada",
               "count": 1
            },
            {
               "term": "bra",
               "count": 1
            }
         ]
      }
   }

我所期望的是得到一个单一的方面的术语与“abracada文胸”作为价值。

共有1个答案

堵鸿光
2023-03-14

你的映射和你期望的行为是正确的。

这里很可能有其他错误,所以您应该检查是否确实有假设的映射。

例如,您的术语筛选器({“术语”:{“制造商”:“abracada”}})与“abracada文胸”不匹配。

下面是一个可以运行的示例:https://www.found.no/play/gist/cf4e908967e6512bc3b2

export ELASTICSEARCH_ENDPOINT="http://localhost:9200"

# Create indexes

curl -XPUT "$ELASTICSEARCH_ENDPOINT/products_test" -d '{
    "settings": {},
    "mappings": {
        "product": {
            "properties": {
                "manufacturer": {
                    "type": "string",
                    "index": "not_analyzed"
                }
            }
        }
    }
}'


# Index documents
curl -XPOST "$ELASTICSEARCH_ENDPOINT/_bulk?refresh=true" -d '
{"index":{"_index":"products_test","_type":"product","_id":1}}
{"manufacturer":"bra"}
{"index":{"_index":"products_test","_type":"product","_id":2}}
{"manufacturer":"abracada bra"}
{"index":{"_index":"products_test","_type":"product","_id":3}}
{"manufacturer":"abracada"}
'

# Do searches

# Note: The filter is for "abracada bra" and not "abracada"
curl -XPOST "$ELASTICSEARCH_ENDPOINT/_search?pretty" -d '
{
    "query": {
        "filtered": {
            "filter": {
                "term": {
                    "manufacturer": "abracada bra"
                }
            }
        }
    },
    "facets": {
        "f_manufacturer": {
            "terms": {
                "all_terms": false,
                "field": "manufacturer",
                "order": "term",
                "size": 30
            }
        }
    }
}
'

curl -XPOST "$ELASTICSEARCH_ENDPOINT/_search?pretty" -d '
{
    "query": {
        "filtered": {
            "filter": {
                "term": {
                    "manufacturer": "abracada"
                }
            }
        }
    },
    "facets": {
        "f_manufacturer": {
            "terms": {
                "all_terms": false,
                "field": "manufacturer",
                "order": "term",
                "size": 30
            }
        }
    }
}
'
 类似资料:
  • 问题内容: 如何在结果中返回特定字段的标记 例如,一个GET请求 退货 我想在结果中包含“ _source.message”字段的标记 问题答案: 使用以下script_fields脚本还有另一种方法: 重要的是要注意,尽管此脚本返回已被索引的实际术语,但它也会缓存所有字段值,并且在大索引上会占用大量内存。因此,在较大的索引上,使用以下MVEL脚本从存储的字段或源中检索字段值并快速重新解析它们可能

  • 探索中等维数据的有用方法是在数据集的不同子集上绘制同一图的多个实例。 这种技术通常被称为“格子”或“格子”绘图,它与“小倍数”的概念有关。 要使用这些功能,您的数据必须位于Pandas DataFrame中。 绘制小数倍的数据子集 在上一章中,我们已经看到了FacetGrid示例,其中FacetGrid类有助于使用多个面板在数据集的子集中分别显示一个变量的分布以及多个变量之间的关系。 FacetG

  • 问题内容: 我正在尝试使用以下查询对以下数据进行elasticsearch来执行术语聚合,输出将名称分解为标记(请参见下面的输出)。因此,我尝试将os_name映射为multi_field,但现在无法通过它查询。是否可以有没有令牌的索引?例如“ Fedora Core”? 查询: 数据: 输出: 映射: 问题答案: 实际上,您应该像这样更改映射 并且您的aggs应该更改为:

  • 问题内容: 有没有一种方法可以将条件附加到值数组中? 例如,如果我的文档如下所示: 我想在其后面附加“ item4”和“ item5”。 我必须在2个查询中这样做吗?一个加载当前值列表,然后更新该列表?还是有一种更优雅的方式让我在一个查询中附加这些项目? 我正在尝试使用Elastic4s做到这一点: 为了使用上面的代码片段,我需要启用groovy脚本,而且我不确定如何对多个项目执行此操作。 任何想

  • 问题内容: 我在为elasticsearch实现自动完成功能时遇到问题,这是我的设置: 创建自动完成的分析器 然后,使用“别名”属性中的分析器在自动完成中创建一个类型: 之后; 添加文档: 当我运行以下命令时: 结果是 和 但是我应该在“别名”字段中获取我的文档,我有一个“ bs as”。 我尝试使用API,并得到了我认为是预期令牌的正确答案: 结果: 有什么提示吗? 编辑: 当我用实际类型运行分

  • 我们目前正在开发一个多语言文档CMS。因此,我们有翻译成不同语言的文件。 对于使用Elasticsearch进行搜索,我们目前使用每种语言(德语、英语、法语……)一个索引,其中同一文档的所有翻译共享相同的ID。 当用户搜索特定术语时,我们希望在所有语言中搜索,但只返回不同ID的列表。据我所知,只有使用以下术语聚合才能做到这一点: 这很好,但是作为弹性搜索文档https://www.elastic.