FOS弹性嵌套过滤器不工作 [英] FOS elastica nested filter not working

查看:198
本文介绍了FOS弹性嵌套过滤器不工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我有一个人实体,这里是从


的映射

  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
}
}
},
认证:{
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 b $ bname:{
type:string,
store:true
}
}
},
类型:{
type:string,
store:true
}
}
}
}
}
}

数据似乎被填充正确,有一个具有以下标签的人实体

  {
people:[
{
id:13355,
cre ated_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,
link:[
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,
认证:认证
}
]
}

你看到有两个名称为position和kategorie的标签



这是我的代码,我的basequery是一个通配符,完美的属性

  $ 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:{
查询:{
wildcard:{
fullname:{
value:**,
boost:1
}

},
过滤器:{
嵌套:{
路径:标签,
过滤器:{
term:{
name:position
}
}
}
}
}
}
size:10,
from:0
}

但没有结果,如果我省略嵌套的术语过滤器它的作品



任何想法我做错了什么?这是我的导航地图:

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


解决方案

所以我自己几个月就碰到了这个问题前。长篇小说,弹性搜索索引正在分解您的标签名称,因此位置不再具有完全匹配。它的索引中的弹性搜索实际上更接近于pos,it和,您或者需要让弹性搜索知道,当你将对象转移到索引上时,或者你只是搜索通过你的标签的id而不是名字。我最终采取了id路由,因为它对我来说似乎更有效率。



这里是我的代码作为一个例子,请注意,我将嵌套的过滤器嵌入到一个bool过滤器中,因为我有其他搜索参数,我没有显示在这里:

  $ 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
}
]


I'm struggling get my nested filter for tags to work,

I have a person entity and here is its mapping from

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
          }
        }
      }
    }
  }
}

the data seems to be populated correct, there is a person entity with following tags

{
  "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"
    }
  ]
}

you see there are two tags with names "position" and "kategorie"

here is my code, my basequery is a wildcard on fullname property which works perfect

$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);

here's the resulting 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
}

but there are no results, if I leave out the nested term filter it works

any idea what I'm doing wrong? here's my orm-mapping:

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

解决方案

So I actually ran into this problem myself a few months ago. Long story short, the elastic search index is breaking up the name of your tag so "position" no longer has an exact match. What elastic search has in it's index is actually something closer to "pos", "it", and "tion" You either need to let elastic search know to know break up that field when you hand the object over for indexing or you just search by the id of your tag rather than by the name. I ended up taking the id route because it seemed more efficient to me.

here is my code as an example, note that i embed my nested filter into a bool filter because i have other search parameters that i'm not showing here:

$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);

and a snippet of my elastic object:

"name": "Sample Object",
"published": true
"categories": [
    {
        "id": 1,
        "name": "cool"
    },
    {
        "id": 3,
        "name": "awesome"
    }
]

这篇关于FOS弹性嵌套过滤器不工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆