Elastic 6.2将数据写入错误的索引

时间:2018-09-08 13:45:36

标签: php elasticsearch

我需要使用其他字段更新映射,但是决定先创建一个实验性映射,然后向其中写入文档以清除问题。

在这里,原始的是:

"index": "bookmark",
"type": "bookmark"

...而实验是:

"index": "experiment",
"type": "experiment"

碰巧,整个过程在第一次询问时就起作用了,但随后的下一个文档却没有,而是写入了“书签”索引。

我已经花了几个小时来更改索引和类型的名称,尽管有时它会一次或可能多次写入“实验”索引,但随后它会切换到“书签”而无需恢复。

在应用程序中,有两个对索引和类型的引用,并且都作为数组传递给处理弹性工作的类。

如果删除要传递给Elastic的文档的“数据”数组,它将不会写入数据,我想应该是显而易见的,但是在正常情况下,它会忽略“ meta_information”对象,索引和类型。

值得注意的是,这是一个成熟的应用程序,自5.6以来一直在使用Elastic而没有错误。

这种行为是无法解释的,并且根据代码,这也是不可能的。

就两个映射之间的差异而言,实验是:有一个附加的“嵌套”对象;和其他“类型”。

我正在使用Elastic 6.2.4和相同版本的Kibana。

根据要求,以下是“实验”索引的映射:

PUT localhost:9200/experiment

{
    "settings":{
        "analysis":{
            "char_filter":{
                "&_to_and":{
                    "type": "mapping",
                    "mappings": ["&=> and "]
                }
            },
            "filter":{
                "asset_en_stopwords":{
                    "type": "stop",
                    "stopwords": ["_english_"]
                },
                "asset_en_stemmer":{
                    "type": "stemmer",
                    "name": "english"
                },
                "asset_en_shingle":{
                    "type": "shingle",
                    "max_shingle_size": 5,
                    "min_shingle_size": 2,
                    "output_unigrams": false,
                    "output_unigrams_if_no_shingles": true
                }
            },
            "analyzer":{
                "asset_en_analyzer":{
                    "type": "custom",
                    "char_filter": ["html_strip", "&_to_and"],
                    "tokenizer": "standard",
                    "filter": ["asset_en_stopwords", "asset_en_stemmer", "lowercase", "asset_en_shingle", "asciifolding"]
                }
            }
        }
    },
    "mappings":{
        "experiment":{
            "properties":{
                "user_id":{
                    "type": "long"
                },
                "creation":{
                    "type": "date",
                    "format": "date_hour_minute_second"
                },
                "deleted":{
                    "type": "integer"
                },
                "favourite":{
                    "type": "integer"
                },
                "modification":{
                    "type": "date",
                    "format": "date_hour_minute_second"
                },
                "note":{
                    "type": "text",
                    "analyzer": "english",
                    "fields":{
                        "std":{
                            "type": "text",
                            "analyzer": "asset_en_analyzer",
                            "fields":{
                                "std":{
                                    "type": "text",
                                    "analyzer": "standard"
                                }
                            }
                        }
                    }
                },
                "title":{
                    "type": "text",
                    "analyzer": "english",
                    "fields":{
                        "std":{
                            "type": "text",
                            "analyzer": "asset_en_analyzer",
                            "fields":{
                                "std":{
                                    "type": "text",
                                    "analyzer": "standard"
                                }
                            }
                        }
                    }
                },
                "links_to_asset":{
                    "type": "nested",
                    "properties":{
                        "note_link_id":{
                            "type": "long"
                        },
                        "user_id":{
                            "type": "long"
                        },
                        "creation":{
                            "type": "date",
                            "format": "date_hour_minute_second"
                        },
                        "modification":{
                            "type": "date",
                            "format": "date_hour_minute_second"
                        },
                        "to_asset":{
                            "type": "integer"
                        },
                        "from_asset":{
                            "type": "integer"
                        },
                        "comment":{
                            "type": "text",
                            "fields":{
                                "std":{
                                    "type": "text",
                                    "analyzer": "asset_en_analyzer",
                                    "fields":{
                                        "std":{
                                            "type": "text",
                                            "analyzer": "standard"
                                        }
                                    }
                                }
                            }
                        }
                    }
                },
                "meta_information":{
                    "type": "nested",
                    "properties":{
                        "entities":{
                            "type": "nested",
                            "properties":{
                                "name":{
                                    "type": "text",
                                    "fields":{
                                        "std":{
                                            "type": "text",
                                            "analyzer": "asset_en_analyzer",
                                            "fields":{
                                                "std":{
                                                    "type": "text",
                                                    "analyzer": "standard"
                                                }
                                            }
                                        }
                                    }
                                },
                                "type":{  
                                    "type":"keyword"
                                },
                                "salience":{
                                    "type":"integer"
                                },
                                "metadata":{
                                    "type": "nested",
                                    "properties":{
                                        "wikipedia_url":{
                                            "type": "keyword"
                                        },
                                        "mid":{
                                            "type": "keyword"
                                        }
                                    }
                                }
                            }
                        },
                        "sentiment":{
                            "type": "nested",
                            "properties":{
                                "score":{
                                    "type":"integer"
                                },
                                "magnitude":{
                                    "type":"integer"
                                }
                            }
                        }
                    }
                },
                "url":{
                    "type": "keyword"
                },
                "publication_date":{
                    "type": "date",
                    "format": "date_hour_minute_second"
                }
            }
        }
    }
}

......和“书签”之间的唯一区别是meta_information嵌套对象类型。

此外,这是写入数据的代码:

    $data = array(
        'user_id' => $this->flexi_auth->get_user_id(),
        'title' => strip_tags( $title ),
        'note' => strip_tags( $note ),
        'creation' => str_replace( ' ', 'T', date("Y-m-d H:i:s") ),
        'modification' => str_replace( ' ', 'T', date("Y-m-d H:i:s") ),
        'publication_date' => $date,
        'url' => $url,
        'links_to_asset' => [],
        'meta_information' => [
            'entities' => $metaInformation['entities'],
            'sentiment' => $metaInformation['sentiment']
        ],
        'favourite' => 0,
        'deleted' => 0
    );

    $params = array(
        'index' => "experiment",
        'type' => "experiment",
        'id' => $note_id
    );

    $this->elasticsearch_model->addAssetData(
        $data, $params
    );

...并在模型中:

public function addAssetData ($data, $params) {
    try {
        if (!isset($params['index']) || !isset($params['type']))
            die ("Unable to add Elastic index for an Asset. Either index or type is not defined.");

        $client = $this->_client;

        foreach ($data as $_id => $insert) {
            $params['body'][$_id] = $insert;
        }

        $responses = $client->index($params);

        return $responses;

    } catch (Exception $e) {
        return $e->getMessage();
    }
}

这里是Elastic干预的地方,有时选择基于这些参数写入数据,然后(过一会儿并且随机地)忽略meta_information数组并切换到索引:“书签”,然后输入:“书签”。

我也在使用the official Elastic PHP package

我已经使用var_dump($data, $params)了无数次,并且这些值都是正确的,但是Elastic是否选择使用该数据是众神所为。

0 个答案:

没有答案