I've been trying to build an index in ES and add the initial items to it (around 350k), using PHP.
I tried all kinds of batch sizes (from 10 items to 1k), check the count, check the threshold, but for some reason it doesn't index every item.
It just skips over some random items, without any errors in the batch result response. I feel like I tried everything and I have to idea what to do next
I'm using Amazon OpenSearch with the latest supported ES (7.10).
The index looks like this:
{
"wonder-search": {
"aliases": {},
"mappings": {
"properties": {
"address": {
"type": "text"
},
"city": {
"type": "text"
},
"city_id": {
"type": "integer"
},
"duration": {
"type": "integer"
},
"filename": {
"type": "text"
},
"geo_point": {
"type": "geo_point"
},
"icon": {
"type": "keyword"
},
"is_sandbox": {
"type": "integer"
},
"item_id": {
"type": "integer"
},
"item_label": {
"type": "keyword"
},
"latitude": {
"type": "float"
},
"longitude": {
"type": "float"
},
"search_text_caption_json": {
"type": "text",
"index_phrases": true
},
"search_text_city_json": {
"type": "text",
"index_phrases": true
},
"search_text_completion": {
"type": "completion",
"analyzer": "simple",
"preserve_separators": true,
"preserve_position_increments": true,
"max_input_length": 50,
"contexts": [
{
"name": "type",
"type": "CATEGORY"
}
]
},
"search_text_country_json": {
"type": "text",
"index_phrases": true
},
"search_text_cuisine_name_json": {
"type": "text",
"index_phrases": true
},
"search_text_location_name_json": {
"type": "text",
"index_phrases": true
},
"search_text_state_json": {
"type": "text",
"index_phrases": true
},
"search_text_tag_name_json": {
"type": "text",
"index_phrases": true
},
"search_text_username_json": {
"type": "text",
"index_phrases": true
},
"sort": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"sort_score": {
"type": "double"
},
"type": {
"type": "text"
},
"user_icon": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"user_id": {
"type": "integer"
},
"username": {
"type": "keyword"
},
"vanity_url": {
"type": "keyword"
},
"video_count": {
"type": "integer"
}
}
},
"settings": {
"index": {
"routing": {
"allocation": {
"include": {
"_tier_preference": "data_content"
}
}
},
"mapping": {
"ignore_malformed": "true"
},
"number_of_shards": "1",
"provided_name": "wonder-search",
"creation_date": "1671003076106",
"number_of_replicas": "1",
"uuid": "YQh1q40WTneLE4MWDWhArw",
"version": {
"created": "7100199"
}
}
}
}
}
and one item looks like this:
{
"_index": "wonder-search",
"_type": "_doc",
"_id": "wq2LD4UBUAuy7FQPhtZh",
"_version": 1,
"_seq_no": 2003,
"_primary_term": 1,
"found": true,
"_source": {
"sort": "4004",
"item_id": "4934",
"user_id": "434",
"user_icon": "/site-content/avatars/Sp8AXjTJvMbRao2oZbuiUuSVH042-1597776099045.jpeg",
"username": "chuurros",
"item_label": "Kyoto Katsugyu【京都勝牛】",
"search_text_username_json": [
"chuurros"
],
"search_text_caption_json": [
"Absolutely love their gyukatsu (beef katsu) here! Delicious and will keep you wanting more! 🥰"
],
"search_text_city_json": [
"Toronto"
],
"search_text_state_json": [
"Ontario"
],
"search_text_country_json": [
"Canada"
],
"search_text_location_name_json": [
"Kyoto Katsugyu【京都勝牛】"
],
"search_text_tag_name_json": [
"japanese",
"restaurant",
"asian",
"dining",
"topcollection-4934"
],
"search_text_cuisine_name_json": [],
"type": "video",
"vanity_url": "",
"icon": "",
"city": "Toronto",
"city_id": "439",
"latitude": "43.65682410",
"longitude": "-79.37617410",
"address": "134 Dundas St E",
"duration": "9.57",
"video_count": "0",
"sort_score": "43",
"filename": "373d75fd-4292-4e5b-a239-4b1c39ffc86c.MOV",
"is_sandbox": "0",
"geo_point": {
"lat": "43.65682410",
"lon": "-79.37617410"
},
"search_text_completion": {
"input": [
"Kyoto Katsugyu【京都勝牛】"
],
"contexts": {
"type": [
"video"
]
}
}
}
}
Any ideas why does it work like this?
Related
I have created an index named filebeat in elasticsearch.The log data is being sent in elasticsearch by filebeat agent.
I want to filter the results based on a particular column/field named value_of_type. Using PHP API :
$json =
'{
"query" : {
"bool" : {
"filter": [
{
"term" :
{
"value_of_type" : "sound"
}
}
]
}
}
}';
But its returning 0 results.
{"took":4,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":0,"max_score":null,"hits":[]}}
The result of hitting myurl:9200/filebeat in browser looks like this :
{
"filebeat": {
"aliases": {},
"mappings": {
"doc": {
"properties": {
"#timestamp": {
"type": "date"
},
"beat": {
"properties": {
"hostname": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"version": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
},
"fields": {
"properties": {
"node": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"value_of_type": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
},
"input_type": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"message": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"offset": {
"type": "long"
},
"source": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"type": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
},
"settings": {
"index": {
"creation_date": "1494116541083",
"number_of_shards": "5",
"number_of_replicas": "1",
"uuid": "IdhWgIqiQ-GNrZK3AvCP9g",
"version": {
"created": "5020199"
},
"provided_name": "filebeat"
}
}
}
}
Your query is correct, but it doesn't match anything in the index: the documents you have indexed don't have the correct structure.
For you query to match a document, documents in your index should have a value_of_type field with value "sound" (like returned in the sample response below.)
A simple GET /filebeat/_search query (without any filter) should give a result like this:
{
"took": 28,
"timed_out": false,
"hits": {
"total": N, // the number of documents in your index
"max_score": 1,
"hits": [
...
{
"_index": "filebeat",
"_type": "some_doc_type",
"_id": "some_id",
"_score": 1,
"_source": {
...
"value_of_type": "sound", // that's what you query will match
...
}
]
}
I have a mapping like this
{
"settings": {
"analysis": {
"filter": {
"nGramFilter": {
"type": "nGram",
"min_gram": 3,
"max_gram": 20,
"token_chars": [
"letter",
"digit",
"punctuation",
"symbol"
]
},
"email" : {
"type" : "pattern_capture",
"preserve_original" : 1,
"patterns" : [
"([^#]+)",
"(\\p{L}+)",
"(\\d+)",
"#(.+)"
]
},
"number" : {
"type" : "pattern_capture",
"preserve_original" : 1,
"patterns" : [
"([^+-]+)",
"(\\d+)"
]
},
"edgeNGramFilter": {
"type": "nGram",
"min_gram": 1,
"max_gram": 10,
"token_chars": [
"letter",
"digit",
"punctuation",
"symbol"
]
}
},
"analyzer": {
"nGramAnalyzer": {
"type": "custom",
"tokenizer": "whitespace",
"filter": [
"lowercase",
"nGramFilter"
]
},
"whitespaceAnalyzer": {
"type": "custom",
"tokenizer": "whitespace",
"filter": [
"lowercase"
]
},
"email" : {
"tokenizer" : "uax_url_email",
"filter" : [
"email",
"lowercase",
"unique"
]
},
"number" : {
"tokenizer" : "whitespace",
"filter" : [ "number", "unique" ]
},
"edgeNGramAnalyzer": {
"type": "custom",
"tokenizer": "whitespace",
"filter": [
"lowercase",
"edgeNGramFilter"
]
}
}
}
},
"users": {
"mappings": {
"user_profiles": {
"properties": {
"firstName": {
"type": "string",
"analyzer": "nGramAnalyzer",
"search_analyzer": "whitespaceAnalyzer"
},
"lastName": {
"type": "string",
"analyzer": "nGramAnalyzer",
"search_analyzer": "whitespaceAnalyzer"
},
"email": {
"type": "string",
"analyzer": "email",
"search_analyzer": "whitespaceAnalyzer"
},
"score" : {
"type": "string"
},
"homeLandline": {
"type": "string",
"analyzer": "number",
"search_analyzer": "whitespaceAnalyzer"
},
"dob": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss"
},
"mobile": {
"type": "integer"
},
"residenceCity": {
"type": "string",
"analyzer": "edgeNGramAnalyzer",
"search_analyzer": "whitespaceAnalyzer"
},
"created_at": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss"
},
}
}
}
}
}
I can get the score as integer as well as "NA" so I mapped the type as string but while posting data to the index i am getting Number Format Exception.
For Example:
if I post first data as integer and followed by "NA". I am getting these exception.
while checking my log file I am getting this errors:
[2016-08-29 15:19:01] elasticlog.WARNING: Response ["{\"error\":{\"root_cause\":[{\"type\":\"mapper_parsing_exception\",\"reason\":\"failed
to parse
[score]\"}],\"type\":\"mapper_parsing_exception\",\"reason\":\"failed
to parse
[score]\",\"caused_by\":{\"type\":\"number_format_exception\",\"reason\":\"For
input string: \"NH\"\"}},\"status\":400}"] []
Your mapping is incorrect. It should be, assuming, users is the index name and user_profiles is the type:
{
"users": {
"mappings": {
"user_profiles": {
"properties": {
"score": {
"type": "string"
}
}
}
}
}
}
You have a missing mappings before user_profiles.
I have a JSON Schema for new orders, that consists of order list and address.
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "array",
"properties": {
"order": {
"type": "array",
"items": {
"type": "array",
"properties": {
"product_id": {
"type": "integer"
},
"quantity": {
"type": "integer"
}
},
"required": [
"product_id",
"quantity"
]
}
},
"address": {
"type": "array",
"properties": {
"name": {
"type": "string"
},
"phone": {
"type": "integer"
},
"address1": {
"type": "string"
},
"address2": {
"type": "string"
},
"city": {
"type": "string"
},
"state_or_region": {
"type": "string"
},
"country": {
"type": "string"
}
},
"required": [
"name",
"phone",
"address1",
"city",
"state_or_region",
"country"
]
}
},
"required": [
"order",
"address"
]
}
But it doesn't seem to actually validate the items at all (I'm using Laravel 5.2 with "justinrainbow/json-schema": "~2.0" ):
$refResolver = new \JsonSchema\RefResolver(new \JsonSchema\Uri\UriRetriever(), new \JsonSchema\Uri\UriResolver());
$schema = $refResolver->resolve(storage_path('schemas\orders.post.json'));
$errors = [];
$input = Request::input();
// Validate
$validator = new \JsonSchema\Validator();
$validator->check($input, $schema);
$msg = [];
if ($validator->isValid()) {
return Response::json(['valid'], 200, [], $this->pritify);
} else {
$msg['success'] = false;
$msg['message'] = "JSON does not validate";
foreach ($validator->getErrors() as $error) {
$msg['errors'][] = [
'error' => ($error['property'] = ' ') ? 'wrong_data' : $error['property'],
'message' => $error['message']
];
}
return Response::json($msg, 422, [], $this->pritify);
}
A request like this always comes valid:
{
"order": [
{
"product_id": 100,
"quantity": 1
},
{
"product_id": 0,
"quantity": 2
}
],
"address": []
}
Any ideas what am I doing wrong?
You have messed array and object types. The only array value in your scheme must be order. Fixed scheme:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"order": {
"type": "array",
"items": {
"type": "object",
"properties": {
"product_id": {
"type": "integer"
},
"quantity": {
"type": "integer"
}
},
"required": [
"product_id",
"quantity"
]
}
},
"address": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"phone": {
"type": "integer"
},
"address1": {
"type": "string"
},
"address2": {
"type": "string"
},
"city": {
"type": "string"
},
"state_or_region": {
"type": "string"
},
"country": {
"type": "string"
}
},
"required": [
"name",
"phone",
"address1",
"city",
"state_or_region",
"country"
]
}
},
"required": [
"order",
"address"
]
}
And validation errors I got with you test data:
JSON does not validate. Violations:
[address.name] The property name is required
[address.phone] The property phone is required
[address.address1] The property address1 is required
[address.city] The property city is required
[address.state_or_region] The property state_or_region is required
[address.country] The property country is required
I have a dynamic field named *_value. The field os_value which contains value like android 5,android 5.1, android 6 etc.
While doing facet on field os_value, the values are getting tokenized to android count as 3 , 5 as 1 , 5.1 as 1 and 6 as 1.
The mapping for the index is as below.
{
"test_prod": {
"aliases": {},
"mappings": {
"products": {
"properties": {
"*_capacity": {
"type": "string",
"index": "not_analyzed"
},
"*_value": {
"type": "string",
"index": "not_analyzed",
"include_in_all": false
},
"*_rating": {
"type": "double"
},
"*_value": {
"type": "string",
"index": "not_analyzed"
},
"attribute_set": {
"type": "string",
"index": "not_analyzed"
},
"availability": {
"type": "integer"
},
"battery_capacity": {
"type": "string"
},
"battery_capacity_value": {
"type": "long"
},
"battery_life_rating": {
"type": "long"
},
"brand": {
"type": "string",
"index": "not_analyzed"
},
"brand_label": {
"type": "string"
},
"camera_rating": {
"type": "long"
},
"capacity": {
"type": "long"
},
"category": {
"type": "string",
"index": "not_analyzed"
},
"class": {
"type": "string",
"index": "not_analyzed"
},
"color": {
"type": "string",
"index": "not_analyzed"
},
"configuration": {
"type": "string",
"index": "not_analyzed"
},
"connectivity": {
"type": "string",
"index": "not_analyzed"
},
"created_at": {
"type": "integer"
},
"description": {
"type": "string"
},
"design_rating": {
"type": "long"
},
"designed_for": {
"type": "string",
"index": "not_analyzed"
},
"discount": {
"type": "double"
},
"display_rating": {
"type": "long"
},
"features": {
"type": "string",
"index": "not_analyzed"
},
"front_camera_resolution_range": {
"type": "string",
"index": "not_analyzed"
},
"front_camera_resolution_value": {
"type": "long"
},
"graphics_memory_capacity": {
"type": "string"
},
"hard_disk_capacity": {
"type": "string"
},
"headset_design": {
"type": "string",
"index": "not_analyzed"
},
"headset_type": {
"type": "string",
"index": "not_analyzed"
},
"id": {
"type": "integer"
},
"image_big": {
"type": "string",
"index": "not_analyzed",
"include_in_all": false
},
"image_slider": {
"type": "string",
"index": "not_analyzed",
"include_in_all": false
},
"image_thumb": {
"type": "string",
"index": "not_analyzed",
"include_in_all": false
},
"interface": {
"type": "string",
"index": "not_analyzed"
},
"internal_storage": {
"type": "string",
"index": "not_analyzed"
},
"is_default": {
"type": "integer"
},
"is_exclusive": {
"type": "integer"
},
"key": {
"type": "string"
},
"last_update": {
"type": "date",
"format": "Y-m-d H:m:s"
},
"material": {
"type": "string"
},
"model": {
"type": "string"
},
"mrp": {
"type": "double"
},
"ndtv_rating": {
"type": "long"
},
"network_type": {
"type": "string",
"index": "not_analyzed"
},
"os": {
"type": "string",
"index": "not_analyzed"
},
"os_label": {
"type": "string"
},
"performance_rating": {
"type": "long"
},
"popularity": {
"type": "integer"
},
"processor_core": {
"type": "string",
"index": "not_analyzed"
},
"processor_name": {
"type": "string",
"index": "not_analyzed"
},
"product_id": {
"type": "long"
},
"product_specs": {
"type": "string"
},
"promo_label": {
"type": "string"
},
"pros_cons": {
"type": "string"
},
"ram_range": {
"type": "string"
},
"ram_value": {
"type": "long"
},
"rear_camera_resolution_range": {
"type": "string",
"index": "not_analyzed"
},
"rear_camera_resolution_value": {
"type": "long"
},
"register_mode": {
"type": "string"
},
"related_sku": {
"type": "string"
},
"release_priority": {
"type": "long"
},
"review_url": {
"type": "string"
},
"screen_size": {
"type": "string",
"index": "not_analyzed"
},
"screen_size_value": {
"type": "double"
},
"selling_price": {
"type": "double"
},
"shop_url": {
"type": "string"
},
"sim3g": {
"type": "long"
},
"sim4g": {
"type": "long"
},
"sim_type": {
"type": "string"
},
"sku": {
"type": "string"
},
"slug": {
"type": "string"
},
"software_rating": {
"type": "long"
},
"source": {
"type": "string"
},
"ssd_capacity": {
"type": "string"
},
"stock": {
"type": "string"
},
"subtitle": {
"type": "string"
},
"system_memory": {
"type": "string"
},
"tags": {
"type": "string"
},
"theme": {
"type": "string",
"index": "not_analyzed"
},
"title": {
"type": "string"
},
"title_raw": {
"type": "string",
"index": "not_analyzed"
},
"title_suggest": {
"type": "string",
"analyzer": "autocomplete_analyzer",
"search_analyzer": "standard"
},
"type": {
"type": "string",
"index": "not_analyzed"
},
"value_for_money_rating": {
"type": "long"
},
"variant_id": {
"type": "integer"
},
"voice_calling": {
"type": "integer"
},
"wifi": {
"type": "integer"
},
"wired_or_wireless": {
"type": "string",
"index": "not_analyzed"
}
}
}
},
"settings": {
"index": {
"creation_date": "1467010796904",
"analysis": {
"filter": {
"autocomplete_filter": {
"type": "edge_ngram",
"min_gram": "1",
"max_gram": "20"
}
},
"analyzer": {
"autocomplete_analyzer": {
"filter": ["lowercase", "autocomplete_filter"],
"type": "custom",
"tokenizer": "standard"
}
}
},
"number_of_shards": "5",
"number_of_replicas": "1",
"uuid": "BJbw5tD-assad",
"version": {
"created": "2030399"
}
}
},
"warmers": {}
}
}
Also the values are converting to lowercase while faceting . Am I doing anything wrong? . Please help.
Ok, I see what you're trying to achieve. What you actually need are dynamic templates. You'll need to delete your index and recreate it like this:
POST test_prod
{
"mappings": {
"products": {
"dynamic_templates": [
{
"capacities": {
"match_mapping_type": "string",
"match": "*_capacity",
"mapping": {
"type": "string",
"index": "not_analyzed"
}
}
},
{
"values": {
"match_mapping_type": "string",
"match": "*_value",
"mapping": {
"type": "string",
"index": "not_analyzed"
}
}
},
{
"ratings": {
"match": "*_rating",
"mapping": {
"type": "double"
}
}
}
],
"properties": {
"attribute_set": {
"type": "string",
"index": "not_analyzed"
},
"availability": {
"type": "integer"
},
"battery_capacity": {
"type": "string"
},
"battery_capacity_value": {
"type": "long"
},
"battery_life_rating": {
"type": "long"
},
"brand": {
"type": "string",
"index": "not_analyzed"
},
"brand_label": {
"type": "string"
},
"camera_rating": {
"type": "long"
},
"capacity": {
"type": "long"
},
"category": {
"type": "string",
"index": "not_analyzed"
},
"class": {
"type": "string",
"index": "not_analyzed"
},
"color": {
"type": "string",
"index": "not_analyzed"
},
"configuration": {
"type": "string",
"index": "not_analyzed"
},
"connectivity": {
"type": "string",
"index": "not_analyzed"
},
"created_at": {
"type": "integer"
},
"description": {
"type": "string"
},
"design_rating": {
"type": "long"
},
"designed_for": {
"type": "string",
"index": "not_analyzed"
},
"discount": {
"type": "double"
},
"display_rating": {
"type": "long"
},
"features": {
"type": "string",
"index": "not_analyzed"
},
"front_camera_resolution_range": {
"type": "string",
"index": "not_analyzed"
},
"front_camera_resolution_value": {
"type": "long"
},
"graphics_memory_capacity": {
"type": "string"
},
"hard_disk_capacity": {
"type": "string"
},
"headset_design": {
"type": "string",
"index": "not_analyzed"
},
"headset_type": {
"type": "string",
"index": "not_analyzed"
},
"id": {
"type": "integer"
},
"image_big": {
"type": "string",
"index": "not_analyzed",
"include_in_all": false
},
"image_slider": {
"type": "string",
"index": "not_analyzed",
"include_in_all": false
},
"image_thumb": {
"type": "string",
"index": "not_analyzed",
"include_in_all": false
},
"interface": {
"type": "string",
"index": "not_analyzed"
},
"internal_storage": {
"type": "string",
"index": "not_analyzed"
},
"is_default": {
"type": "integer"
},
"is_exclusive": {
"type": "integer"
},
"key": {
"type": "string"
},
"last_update": {
"type": "date",
"format": "Y-m-d H:m:s"
},
"material": {
"type": "string"
},
"model": {
"type": "string"
},
"mrp": {
"type": "double"
},
"ndtv_rating": {
"type": "long"
},
"network_type": {
"type": "string",
"index": "not_analyzed"
},
"os": {
"type": "string",
"index": "not_analyzed"
},
"os_label": {
"type": "string"
},
"performance_rating": {
"type": "long"
},
"popularity": {
"type": "integer"
},
"processor_core": {
"type": "string",
"index": "not_analyzed"
},
"processor_name": {
"type": "string",
"index": "not_analyzed"
},
"product_id": {
"type": "long"
},
"product_specs": {
"type": "string"
},
"promo_label": {
"type": "string"
},
"pros_cons": {
"type": "string"
},
"ram_range": {
"type": "string"
},
"ram_value": {
"type": "long"
},
"rear_camera_resolution_range": {
"type": "string",
"index": "not_analyzed"
},
"rear_camera_resolution_value": {
"type": "long"
},
"register_mode": {
"type": "string"
},
"related_sku": {
"type": "string"
},
"release_priority": {
"type": "long"
},
"review_url": {
"type": "string"
},
"screen_size": {
"type": "string",
"index": "not_analyzed"
},
"screen_size_value": {
"type": "double"
},
"selling_price": {
"type": "double"
},
"shop_url": {
"type": "string"
},
"sim3g": {
"type": "long"
},
"sim4g": {
"type": "long"
},
"sim_type": {
"type": "string"
},
"sku": {
"type": "string"
},
"slug": {
"type": "string"
},
"software_rating": {
"type": "long"
},
"source": {
"type": "string"
},
"ssd_capacity": {
"type": "string"
},
"stock": {
"type": "string"
},
"subtitle": {
"type": "string"
},
"system_memory": {
"type": "string"
},
"tags": {
"type": "string"
},
"theme": {
"type": "string",
"index": "not_analyzed"
},
"title": {
"type": "string"
},
"title_raw": {
"type": "string",
"index": "not_analyzed"
},
"title_suggest": {
"type": "string",
"analyzer": "autocomplete_analyzer",
"search_analyzer": "standard"
},
"type": {
"type": "string",
"index": "not_analyzed"
},
"value_for_money_rating": {
"type": "long"
},
"variant_id": {
"type": "integer"
},
"voice_calling": {
"type": "integer"
},
"wifi": {
"type": "integer"
},
"wired_or_wireless": {
"type": "string",
"index": "not_analyzed"
}
}
}
},
"settings": {
"index": {
"analysis": {
"filter": {
"autocomplete_filter": {
"type": "edge_ngram",
"min_gram": "1",
"max_gram": "20"
}
},
"analyzer": {
"autocomplete_analyzer": {
"filter": [
"lowercase",
"autocomplete_filter"
],
"type": "custom",
"tokenizer": "standard"
}
}
},
"number_of_shards": "5",
"number_of_replicas": "1"
}
}
}
Below is the JSON object I am trying to parse. It its basically the answers to a dynamic form. I know I can convert it to an array and then work with it. The issue I am having is the JSON object will be different every time.
{
"sections": [
{
"elements": [
{
"element": "greeting",
"components": {
"paragraph": {
"content": "Thank you for calling company name. This is a test call."
}
}
},
{
"element": "custom-fullname",
"components": {
"label": {
"content": ""
},
"first_name": {
"name": "1[custom-fullname][first_name]",
"label": "First Name",
"type": "text",
"value": "John",
"required": ""
},
"last_name": {
"name": "1[custom-fullname][last_name]",
"label": "Last Name",
"type": "text",
"value": "smith",
"required": ""
},
"help_text": {
"content": ""
}
}
},
{
"element": "custom-phone",
"components": {
"label": {
"content": "Phone Number"
},
"phone_ext": {
"name": "2[custom-phone][phone_ext]",
"type": "text",
"value": ""
},
"input_format": {
"name": "2[custom-phone][phone_format]",
"type": "hidden",
"value": "standard"
},
"help_text": {
"content": ""
},
"phone": {
"value": "7864564444",
"required": "false",
"name": "2[custom-phone][phone]"
}
}
},
{
"element": "custom-message",
"components": {
"label": {
"content": "Message"
},
"message": {
"name": "3[custom-message][message]",
"type": "text",
"value": "test time 22222",
"required": ""
},
"help_text": {
"content": ""
}
}
},
{
"element": "notes",
"components": {
"paragraph": {
"content": "This is a test call. Please mark this as a test."
}
}
}
],
"faqs": [
{
"question": "Should i have a FAQ?",
"answer": "Yes, this will help the agent to have a fluent conversation with the caller."
}
]
},
{
"elements": [
{
"element": "greeting",
"components": {
"paragraph": {
"content": "Thank you for calling company name. This is a test call."
}
}
},
{
"element": "custom-fullname",
"components": {
"label": {
"content": ""
},
"first_name": {
"name": "1[custom-fullname][first_name]",
"label": "First Name",
"type": "text",
"value": "robert",
"required": ""
},
"last_name": {
"name": "1[custom-fullname][last_name]",
"label": "Last Name",
"type": "text",
"value": "gonzalez",
"required": ""
},
"help_text": {
"content": ""
}
}
},
{
"element": "custom-phone",
"components": {
"label": {
"content": "Phone Number"
},
"phone_ext": {
"name": "2[custom-phone][phone_ext]",
"type": "text",
"value": ""
},
"input_format": {
"name": "2[custom-phone][phone_format]",
"type": "hidden",
"value": "standard"
},
"help_text": {
"content": ""
},
"phone": {
"value": "7864564444",
"required": "false",
"name": "2[custom-phone][phone]"
}
}
},
{
"element": "custom-message",
"components": {
"label": {
"content": "Message"
},
"message": {
"name": "3[custom-message][message]",
"type": "text",
"value": "Test",
"required": ""
},
"help_text": {
"content": ""
}
}
},
{
"element": "notes",
"components": {
"paragraph": {
"content": "This is a test call. Please mark this as a test."
}
}
}
],
"faqs": [
{
"question": "Should i have a FAQ?",
"answer": "Yes, this will help the agent to have a fluent conversation with the caller."
}
]
},
{
"elements": [
{
"element": "greeting",
"components": {
"paragraph": {
"content": "Thank you for calling company name. This is a test call."
}
}
},
{
"element": "custom-fullname",
"components": {
"label": {
"content": ""
},
"first_name": {
"name": "1[custom-fullname][first_name]",
"label": "First Name",
"type": "text",
"value": "robert",
"required": ""
},
"last_name": {
"name": "1[custom-fullname][last_name]",
"label": "Last Name",
"type": "text",
"value": "gonzalez",
"required": ""
},
"help_text": {
"content": ""
}
}
},
{
"element": "custom-phone",
"components": {
"label": {
"content": "Phone Number"
},
"phone_ext": {
"name": "2[custom-phone][phone_ext]",
"type": "text",
"value": ""
},
"input_format": {
"name": "2[custom-phone][phone_format]",
"type": "hidden",
"value": "standard"
},
"help_text": {
"content": ""
},
"phone": {
"value": "7861238975",
"required": "false",
"name": "2[custom-phone][phone]"
}
}
},
{
"element": "custom-message",
"components": {
"label": {
"content": "Message"
},
"message": {
"name": "3[custom-message][message]",
"type": "text",
"value": "test time 22222",
"required": ""
},
"help_text": {
"content": ""
}
}
},
{
"element": "radio",
"components": {
"label": {
"content": "Whats type of office are you looking for?"
},
"radiolist": [
{
"input": {
"value": "value_0",
"id": "single_choice_answer_0"
},
"label": {
"content": "Dedicated Space"
}
},
{
"input": {
"value": "value_1",
"id": "single_choice_answer_1"
},
"label": {
"content": "Parttime Space"
}
}
],
"single_choice_answer": {
"value": "value_0",
"name": "4[radio][single_choice_answer]",
"required": ""
},
"help_text": {
"content": ""
}
}
}
],
"faqs": [
{
"question": "Should i have a FAQ?",
"answer": "Yes, this will help the agent to have a fluent conversation with the caller."
}
]
}
]
}
So, for example a part of the JSON object looks like the following.
"components": {
"label": {
"content": "Whats type of office are you looking for?"
},
"radiolist": [
{
"input": {
"value": "value_0",
"id": "single_choice_answer_0"
},
"label": {
"content": "Dedicated Space"
}
},
{
"input": {
"value": "value_1",
"id": "single_choice_answer_1"
},
"label": {
"content": "Parttime Space"
}
}
],
"single_choice_answer": {
"value": "value_0",
"name": "4[radio][single_choice_answer]",
"required": ""
},
I would like to take that and do something like the following:
{
"components": {
"label": {
"content": "Whats type of office are you looking for?"
},
"answer": {
"value": "value_0",
"name": "Dedicated Space",
"required": ""
}
}
Really I just need the form questions and answer formatted a little nicer in a JSON object. However, I'm not sure how to code this in PHP.