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

FOS elastica嵌套过滤器不工作

东方方伟
2023-03-14
http://localhost:9200/search/person/_mapping
{
  "search": {
    "mappings": {
      "person": {
        "_meta": {
          "model": "Foo\\CoreBundle\\Entity\\Person"
        },
        "properties": {
          "adresses": {
            "type": "nested",
            "properties": {
              "city": {
                "type": "string",
                "store": true
              }
            }
          },
          "certified": {
            "type": "string",
            "store": true
          },
          "completeness": {
            "type": "string",
            "store": true
          },
          "fullname": {
            "type": "string",
            "store": true
          },
          "lastName": {
            "type": "string",
            "store": true
          },
          "name": {
            "type": "string",
            "store": true
          },
          "source": {
            "type": "string",
            "store": true
          },
          "tags": {
            "type": "nested",
            "properties": {
              "name": {
                "type": "string",
                "store": true
              }
            }
          },
          "type": {
            "type": "string",
            "store": true
          }
        }
      }
    }
  }
}
{
  "people": [
    {
      "id": 13355,
      "created_at": "2014-12-27T09:30:54+0100",
      "updated_at": "2014-12-27T09:30:54+0100",
      "name": "Vorname",
      "last_name": "nachname",
      "ms": "Anrede",
      "title": "Titel",
      "source": "Quelle",
      "description": "info",
      "email": "email",
      "language": "EN",
      "status": "unready",
      "links": [
        "link"
      ],
      "tags": [
        {
          "id": 4176,
          "created_at": "2014-12-27T09:30:54+0100",
          "updated_at": "2014-12-27T09:30:54+0100",
          "name": "position",
          "type": "function"
        },
        {
          "id": 4177,
          "created_at": "2014-12-27T09:30:54+0100",
          "updated_at": "2014-12-27T09:30:54+0100",
          "name": "kategorie",
          "type": "category"
        }
      ],
      "type": "kategorie",
      "slug": "vorname_nachname",
      "certified": "certified"
    }
  ]
}
$finder = $this->container->get('fos_elastica.finder.search.person');
$query = new \Elastica\Query();
$baseQuery=new \Elastica\Query\Wildcard();
$baseQuery->setValue("fullname", "*".trim(mb_strtolower($term))."*", $boost = 1.0);

$nestedFilter = new \Elastica\Filter\Nested();
$termFilter = new \Elastica\Filter\Term();
$termFilter->setTerm("name","position");
$nestedFilter->setPath("tags");
$nestedFilter->setFilter($termFilter);
$baseQuery = new \Elastica\Query\Filtered($baseQuery, $nestedFilter);        
$query->setQuery($baseQuery);
$people = $finder->find($query);
elastica.INFO: search/person/_search (GET) 3.30 ms 
{
  "query": {
    "filtered": {
      "query": {
        "wildcard": {
          "fullname": {
            "value": "**",
            "boost": 1
          }
        }
      },
      "filter": {
        "nested": {
          "path": "tags",
          "filter": {
            "term": {
              "name": "position"
            }
          }
        }
      }
    }
  },
  "size": "10",
  "from": 0
}

你知道我做错了什么吗?下面是我的ORM映射:

/**
 * @ORM\ManyToMany(targetEntity="Foo\CoreBundle\Entity\Tag", inversedBy="tags")
 * @ORM\JoinTable(name="person_has_tags")
 **/
 private $tags;

共有1个答案

吕高寒
2023-03-14

所以几个月前我自己也遇到过这个问题。长话短说,弹性搜索索引正在分解标签的名称,因此“位置”不再有确切的匹配。elastic search在其索引中的内容实际上更接近于“pos”、“it”和“tion”。您要么需要让elastic search知道,以便在将对象提交索引时拆分该字段,要么只根据标记的id而不是名称进行搜索。我最终选择了id路线,因为它对我来说似乎更有效。

下面是我的代码示例,请注意,我将嵌套筛选器嵌入到布尔筛选器中,因为我有其他搜索参数,这里没有显示:

$query = new Query\QueryString('*' . $searchText .'*');
$boolFilter = new Bool();
$nestedFilter = new Nested();
$nestedFilter->setPath('categories');
$categoryFilter = new Term(['id' => $categoryId]);
$nestedFilter->setFilter($categoryFilter);
$boolFilter->addMust($nestedFilter);
$filteredQuery = new Filtered($query, $boolFilter);

和我的弹性物体的一个片段:

"name": "Sample Object",
"published": true
"categories": [
    {
        "id": 1,
        "name": "cool"
    },
    {
        "id": 3,
        "name": "awesome"
    }
]
 类似资料:
  • 问题内容: 我有一个对象映射,它以类似标签的方式使用嵌套对象(在我们的示例中)。每个标签可以属于一个客户/用户,并且当我们要允许我们的用户针对生成样式搜索时。 问题是,当我们运行查询时,如果一个对象有多个道具,并且当其他道具不返回时,如果多个道具之一与过滤器匹配,则当我们想要相反时- 如果一个道具返回false,则不返回vs。如果返回true,则返回true。 我在这里发布了一个完整的示例:htt

  • 问题内容: 使用嵌套对象的布尔运算符时遇到一些麻烦。这是我的映射: 我想获取恰好包含两个指定ip甚至更多的文档。 假设我的文档具有以下ips: 我想通过使用此过滤器进行搜索来仅检索DOC 1: 问题在于,同时检索了DOC 1和DOC2。 问题答案: 你可以使用你的条件过滤器是这样的: 这是我用来测试的一些代码: http://sense.qbox.io/gist/d6b5f4e4c0d2977a0

  • 问题内容: 我有带有嵌套字段的文档,如下所示: 嵌套字段的映射如下所示: 在切换到elasticsearch 2之前,我有一个带有aggs的查询,该查询计算了没有结果的文档。这是查询的聚合部分: 现在我切换到elasticserach 2,它只计算所有文档。我已经尝试过其他操作,例如计算所有文档和计算结果,以便可以减去结果,但是 总是0 如何正确过滤/计数嵌套字段? 问题答案: 如果您要计算产生结

  • 我刚刚升级到Elastic Search 1.5.0,到目前为止,我无法使inner_hits与嵌套过滤器一起工作,尽管它可以与嵌套查询一起工作。 假设我想检索电影对象中的内部嵌套对象演员。 当我运行以下嵌套查询时: 语法 1 = 但是当我尝试使用嵌套过滤器进行等效查询时: 语法 2 = QueryParsingException[[my_index][nested]需要“查询”或“过滤器”字段]

  • 问题内容: 我有这样的角度嵌套对象。有没有办法为嵌套属性过滤它 我只显示父元素,但想按两个元素进行过滤,例如: 问题答案: 是的,如果我正确理解您的示例,则可以。 根据集合的大小,计算迭代所用的集合可能会更好,这样过滤器就不会随着模型的更改而不断地进行操作。 http://jsfiddle.net/suCWn/ 基本上,如果我理解正确,您会执行以下操作:

  • 问题内容: 我在ng-table中有一张发票清单,希望能够对嵌套属性进行过滤。json看起来像这样; 我的看法是这样的 我想让过滤工作于client.fullname。如何过滤嵌套属性? 更新资料 我找到了一种解决方法,将嵌套字段放入非嵌套的JSON元素中,在上面的示例中,我创建了一个JSON [‘client_name’]元素并将其分配给rails模型中的client.fullname。然后,筛