# Filter data from field name on elasticsearch-PHP

**URL:** <https://discuss.elastic.co/t/filter-data-from-field-name-on-elasticsearch-php/268>\
**Category:** Elasticsearch\
**Created:** [May 6, 2015, 9:02am UTC](https://discuss.elastic.co/t/filter-data-from-field-name-on-elasticsearch-php/268 "2015-05-06T09:02:41Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![DamPe](https://avatars.discourse-cdn.com/v4/letter/d/e19b73/32.png) [@DamPe](https://discuss.elastic.co/u/DamPe)\
**Post date:** [May 6, 2015, 9:02am UTC](https://discuss.elastic.co/t/filter-data-from-field-name-on-elasticsearch-php/268/1 "2015-05-06T09:02:41Z")

</div>

I have written an index on Elasticsearch with following fields.

```
    $indexData = [
    'index' => 'profiles',
    'type' => 'profile',
    'body' =>[
                            'id' => $data->id,
                            'first_name' => (string)$data->first_name,
                            'last_name' => (string)$data->last_name,
                            'phone_mobile' => $data->phone_mobile,
                             'phone_work' => $data->phone_work,
                            'company_name' => $data->company_name,   
                         ]
                   ];
        $indexed = $profileElastic->addIndex($indexData);

```

I have managed to filter them using "more\_like\_this". But i need to filter them using the Field Name.

Example: Searching value is : 456 and field is:phone\_mobile. Scenario: First i Need to check that 'phone\_mobile' column is blank or not, if it is not blank, then check whether 'phone\_mobile' column has the value '456',if it is true, return the corresponding Data Set.

If it is 'phone\_mobile' field is blank, then i need to check 'phone\_work' is null or not.if null return empty,otherwise continue the checking.

hope i have explained clearly.  
Thanks in Advance for any help

---

<div class="post-metadata">

**Author:** ![Camilo\_Sierra](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/camilo_sierra/32/14397_2.png) [@Camilo\_Sierra](https://discuss.elastic.co/u/Camilo_Sierra)\
**Post date:** [May 6, 2015, 9:23am UTC](https://discuss.elastic.co/t/filter-data-from-field-name-on-elasticsearch-php/268/2 "2015-05-06T09:23:05Z")

</div>

you can do that with a should, for this you need to use exist filter ([http://www.elastic.co/guide/en/elasticsearch/reference/1.3/query-dsl-exists-filter.html](http://www.elastic.co/guide/en/elasticsearch/reference/1.3/query-dsl-exists-filter.html)) be sure to set to null if empty phone\_mobile or phone\_work.

```
{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "should": [
            {
              "exists": {
                "phone_mobile": "465"
              }
            },
            {
              "exists": {
                "phone_work": "465"
              }
            }
          ],
          "minimum_number_should_match": 1
        }
      }
    }
  }
}
```

---

<div class="post-metadata">

**Author:** ![DamPe](https://avatars.discourse-cdn.com/v4/letter/d/e19b73/32.png) [@DamPe](https://discuss.elastic.co/u/DamPe)\
**Post date:** [May 6, 2015, 10:13am UTC](https://discuss.elastic.co/t/filter-data-from-field-name-on-elasticsearch-php/268/3 "2015-05-06T10:13:46Z")

</div>

is this the way to write the php for that?

```
    $query = $es->search([
	'body' =>[
		'query' =>[
			'bool'=>[
				'should' =>[
					'exists' =>['phone_mobile' =>'456'],
					'exists' =>['phone_home'=>'456'] 
					
				]
			]
		]
	]
]);

```

and how to specify the  
"minimum\_number\_should\_match": 1

---

<div class="post-metadata">

**Author:** ![Camilo\_Sierra](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/camilo_sierra/32/14397_2.png) [@Camilo\_Sierra](https://discuss.elastic.co/u/Camilo_Sierra)\
**Post date:** [May 6, 2015, 12:52pm UTC](https://discuss.elastic.co/t/filter-data-from-field-name-on-elasticsearch-php/268/4 "2015-05-06T12:52:01Z")

</div>

it will be something more like :

```
   [
    'body'=>[
        'filtered'=>[
            'filter'=>[
                'bool'=>[
                    'should'=>[
                        ['exists'=>[
                            'phone_mobile'=>'456'
                        ]],
                        ['exists'=>[
                            'phone_home'=>'456'
                        ]]
                    ],
                    "minimum_number_should_match"=>1
                ]
            ]
        ]
    ]
]

```

for me, the most easy way to work in php is to first create the query in json, and once this query works in elasticsearch and you get the result that you want, you can traduce this json in array. (to test your json query you can check the plugin head (any request))

---

<div class="post-metadata">

**Author:** ![DamPe](https://avatars.discourse-cdn.com/v4/letter/d/e19b73/32.png) [@DamPe](https://discuss.elastic.co/u/DamPe)\
**Post date:** [May 7, 2015, 11:15am UTC](https://discuss.elastic.co/t/filter-data-from-field-name-on-elasticsearch-php/268/5 "2015-05-07T11:15:16Z")

</div>

Hi there,  
Thanks for the reply.Can you tell me how to pass created json query into elasticsearch?.any link which helps on json convert into php on ES?

---

<div class="post-metadata">

**Author:** ![polyfractal](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/polyfractal/32/48162_2.png) [@polyfractal](https://discuss.elastic.co/u/polyfractal)\
**Post date:** [May 7, 2015, 12:33pm UTC](https://discuss.elastic.co/t/filter-data-from-field-name-on-elasticsearch-php/268/6 "2015-05-07T12:33:46Z")

</div>

The ES-PHP client supports raw JSON. See the documentation here: [http://www.elastic.co/guide/en/elasticsearch/client/php-api/current/\_search\_operations.html](http://www.elastic.co/guide/en/elasticsearch/client/php-api/current/_search_operations.html)

```php
$json = '{
    "query" : {
        "match" : {
            "testField" : "abc"
        }
    }
}';

$params['index'] = 'my_index';
$params['type'] = 'my_type';
$params['body'] = $json;

$results = $client->search($params);

```

That said, I would not use raw JSON outside of prototyping/test. It is not very flexible, and easy to make mistakes. To become more familiar with the array representation, you can `json_decode()` the raw JSON string into an array, to learn how it transforms:

```php
$json = '{
    "query" : {
        "match" : {
            "testField" : "abc"
        }
    }
}';

$transformed = json_decode($json, true);
print_r($transformed);

```

---

<div class="post-metadata">

**Author:** ![Camilo\_Sierra](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/camilo_sierra/32/14397_2.png) [@Camilo\_Sierra](https://discuss.elastic.co/u/Camilo_Sierra)\
**Post date:** [May 7, 2015, 12:47pm UTC](https://discuss.elastic.co/t/filter-data-from-field-name-on-elasticsearch-php/268/7 "2015-05-07T12:47:06Z")

</div>

and to test your json query in your elasticsearch you can download [http://mobz.github.io/elasticsearch-head/](http://mobz.github.io/elasticsearch-head/) and in the tab Any Request you can paste your json and execute.

---

<div class="post-metadata">

**Author:** ![DamPe](https://avatars.discourse-cdn.com/v4/letter/d/e19b73/32.png) [@DamPe](https://discuss.elastic.co/u/DamPe)\
**Post date:** [May 13, 2015, 6:57am UTC](https://discuss.elastic.co/t/filter-data-from-field-name-on-elasticsearch-php/268/8 "2015-05-13T06:57:20Z")

</div>

Hi Camilo\_Sierra and polyfractal,  
Thanks for your really help full answers.  
I have managed to write the search using this array as for the searching json.

```
[
'body'=>[
    'filtered'=>[
        'filter'=>[
            'bool'=>[
                'should'=>[
                    ['exists'=>[
                        'phone_mobile'=>'456'
                    ]],
                    ['exists'=>[
                        'phone_home'=>'456'
                    ]]
                ],
                "minimum_number_should_match"=>1
            ]
        ]
    ]
]

```

]

and i am passing this array to the search function like this,

```
$queryResponse = $globalElastic->search( [
'body'=>[
    'filtered'=>[
        'filter'=>[
            'bool'=>[
                'should'=>[
                    ['exists'=>[
                        'phone_mobile'=>'456'
                    ]],
                    ['exists'=>[
                        'phone_home'=>'456'
                    ]]
                ],
                "minimum_number_should_match"=>1
            ]
        ]
    ]
]

```

]);

an error comes up.BadRequest400Exception  
any particular reason for this\>?

---

<div class="post-metadata">

**Author:** ![Camilo\_Sierra](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/camilo_sierra/32/14397_2.png) [@Camilo\_Sierra](https://discuss.elastic.co/u/Camilo_Sierra)\
**Post date:** [May 13, 2015, 7:55am UTC](https://discuss.elastic.co/t/filter-data-from-field-name-on-elasticsearch-php/268/9 "2015-05-13T07:55:44Z")

</div>

oh @DamPe my bad, the filter don't have minimum\_number\_should\_match ! this options is only used in query. you can delete this option and your request will work!

---

<div class="post-metadata">

**Author:** ![DamPe](https://avatars.discourse-cdn.com/v4/letter/d/e19b73/32.png) [@DamPe](https://discuss.elastic.co/u/DamPe)\
**Post date:** [May 13, 2015, 8:23am UTC](https://discuss.elastic.co/t/filter-data-from-field-name-on-elasticsearch-php/268/10 "2015-05-13T08:23:31Z")

</div>

@Camilo_Sierra:Still doesn't work.

```
{"error":"SearchPhaseExecutionException[Failed to execute phase [query]
```

---

<div class="post-metadata">

**Author:** ![Camilo\_Sierra](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/camilo_sierra/32/14397_2.png) [@Camilo\_Sierra](https://discuss.elastic.co/u/Camilo_Sierra)\
**Post date:** [May 13, 2015, 8:39am UTC](https://discuss.elastic.co/t/filter-data-from-field-name-on-elasticsearch-php/268/11 "2015-05-13T08:39:52Z")

</div>

ok , the query will be more complicate but it works

```
{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "should": [
            {
              "bool": {
                "must": [
                  {
                    "exists": {
                      "field": "phone_mobile"
                    }
                  },
                  {
                    "term": {
                      "phone_mobile": 465
                    }
                  }
                ]
              }
            },
            {
              "bool": {
                "must": [
                  {
                    "exists": {
                      "field": "phone_home"
                    }
                  },
                  {
                    "term": {
                      "phone_home": 465
                    }
                  }
                ]
              }
            }
          ]
        }
      }
    }
  }
}
```

---

<div class="post-metadata">

**Author:** ![Camilo\_Sierra](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/camilo_sierra/32/14397_2.png) [@Camilo\_Sierra](https://discuss.elastic.co/u/Camilo_Sierra)\
**Post date:** [May 13, 2015, 8:41am UTC](https://discuss.elastic.co/t/filter-data-from-field-name-on-elasticsearch-php/268/12 "2015-05-13T08:41:31Z")

</div>

@DamPe if you don't use the aggregations and you like to filter only your hits, you can delete "query" and "filtered" and keep only the filter level

---

<div class="post-metadata">

**Author:** ![DamPe](https://avatars.discourse-cdn.com/v4/letter/d/e19b73/32.png) [@DamPe](https://discuss.elastic.co/u/DamPe)\
**Post date:** [May 13, 2015, 8:53am UTC](https://discuss.elastic.co/t/filter-data-from-field-name-on-elasticsearch-php/268/13 "2015-05-13T08:53:25Z")

</div>

@Camilo_Sierra: now it is giving me this error.

```
ErrorException in AbstractEndpoint.php line 299:
Invalid argument supplied for foreach()

```

This file is in here:

```
at HandleExceptions->handleError('2', 'Invalid argument supplied for foreach()', '/web/api/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Endpoints/AbstractEndpoint.php', '299', array('params' => null)) in AbstractEndpoint.php line 299
```

---

<div class="post-metadata">

**Author:** ![DamPe](https://avatars.discourse-cdn.com/v4/letter/d/e19b73/32.png) [@DamPe](https://discuss.elastic.co/u/DamPe)\
**Post date:** [May 13, 2015, 8:58am UTC](https://discuss.elastic.co/t/filter-data-from-field-name-on-elasticsearch-php/268/14 "2015-05-13T08:58:32Z")

</div>

@Camilo_Sierra: I have sorted out the above error.  
but now this error pops out.

```
"query" is not a valid parameter. Allowed parameters are: "analyzer", "analyze_wildcard", "default_operator", "df", "explain", "fields", "from", "ignore_unavailable", "allow_no_indices", "expand_wildcards", "indices_boost", "lenient", "lowercase_expanded_terms", "preference", "q", "routing", "scroll", "search_type", "size", "sort", "source", "_source", "_source_exclude", "_source_include", "stats", "suggest_field", "suggest_mode", "suggest_size", "suggest_text", "timeout", "version", "ignore", "custom", "curlOpts"
```

---

<div class="post-metadata">

**Author:** ![Camilo\_Sierra](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/camilo_sierra/32/14397_2.png) [@Camilo\_Sierra](https://discuss.elastic.co/u/Camilo_Sierra)\
**Post date:** [May 13, 2015, 9:03am UTC](https://discuss.elastic.co/t/filter-data-from-field-name-on-elasticsearch-php/268/15 "2015-05-13T09:03:16Z")

</div>

it is probable that the problem come to your php code when you use the client search, to be sure that it's not the query the problem use a simple query that you already know that it works and replace it in your code!

if it doesn't works its your code php !

---

<div class="post-metadata">

**Author:** ![Camilo\_Sierra](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/camilo_sierra/32/14397_2.png) [@Camilo\_Sierra](https://discuss.elastic.co/u/Camilo_Sierra)\
**Post date:** [May 13, 2015, 9:12am UTC](https://discuss.elastic.co/t/filter-data-from-field-name-on-elasticsearch-php/268/16 "2015-05-13T09:12:36Z")

</div>

i think so that the problem its that you put the query that i send you without the "body" level ?

```
    $queryResponse = $globalElastic->search( [
    'body'=>[
        "and hear the query that i send you (transformed in array off course)"
] ] );
```

---

<div class="post-metadata">

**Author:** ![DamPe](https://avatars.discourse-cdn.com/v4/letter/d/e19b73/32.png) [@DamPe](https://discuss.elastic.co/u/DamPe)\
**Post date:** [May 13, 2015, 9:34am UTC](https://discuss.elastic.co/t/filter-data-from-field-name-on-elasticsearch-php/268/17 "2015-05-13T09:34:56Z")

</div>

@Camilo_Sierra:Yes i have used without the body tag.  
The Query you sent me has to transformed using `json_decode()` right?

---

<div class="post-metadata">

**Author:** ![Camilo\_Sierra](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/camilo_sierra/32/14397_2.png) [@Camilo\_Sierra](https://discuss.elastic.co/u/Camilo_Sierra)\
**Post date:** [May 13, 2015, 9:53am UTC](https://discuss.elastic.co/t/filter-data-from-field-name-on-elasticsearch-php/268/18 "2015-05-13T09:53:32Z")

</div>

yes use json\_decode($query, true);

---

<div class="post-metadata">

**Author:** ![DamPe](https://avatars.discourse-cdn.com/v4/letter/d/e19b73/32.png) [@DamPe](https://discuss.elastic.co/u/DamPe)\
**Post date:** [May 13, 2015, 10:09am UTC](https://discuss.elastic.co/t/filter-data-from-field-name-on-elasticsearch-php/268/19 "2015-05-13T10:09:05Z")

</div>

@Camilo_Sierra:Thanks for Great Help.Now its work.  
Anyway i have a question:  
can you explain these lines?.

```
 "bool": {
            "must": [
              {
                "exists": {
                  "field": "phone_mobile"
                }
              },
              {
                "term": {
                  "phone_mobile": 465
                }
              }
            ]
          }
        },
        {
          "bool": {
            "must": [
              {
                "exists": {
                  "field": "phone_home"
                }
              },
              {
                "term": {
                  "phone_home": 465
                }
              }
            ]
          }

```

in this query what is exactly happening?.Sorry for the trouble mate.

---

<div class="post-metadata">

**Author:** ![Camilo\_Sierra](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/camilo_sierra/32/14397_2.png) [@Camilo\_Sierra](https://discuss.elastic.co/u/Camilo_Sierra)\
**Post date:** [May 13, 2015, 10:36am UTC](https://discuss.elastic.co/t/filter-data-from-field-name-on-elasticsearch-php/268/20 "2015-05-13T10:36:13Z")

</div>

ok firstable i see that we can do something easier.  
and after i will explain you both :

```
   {
    "filter": {
        "bool": {
            "should": [
                {
                    "term": {
                        "phone_mobile": 465
                    }
                },
                {
                    "term": {
                        "phone_home": 465
                    }
                }
            ]
        }
    }
}
```

[Next page](https://discuss.elastic.co/t/filter-data-from-field-name-on-elasticsearch-php/268.md?page=2)
