关键词:Elastica-php匹配多值字段, 给Problem的elementName设中文分词ik
一、Elastica-php匹配多值字段
1.1 实现了匹配选项
1)参考如下:
https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/_search_operations.html
a.)标准的黑窗口查询如下:
curl -XGET'localhost:9200/my_index/my_type/_search' -d '{
"query" : {
"match" : {
"testField" : "abc"
}
}
}'
b.)对应的php客户端的伪代码如下:
$params = [
'index' => 'my_index',
'type' => 'my_type',
'body' => [
'query' => [
'match' => [
'testField' => 'abc'
]
]
]
];
$results = $client->search($params);
分析:
$params = [
'index' => 'my_index',
'type' => 'my_type',
'body' => [
'query' => [
'match' => [
'testField' => 'abc'
]
]
]
];
print_r(json_encode($params['body']));
{"query":{"match":{"testField":"abc"}}}
c.)php客户端使用json串如下:
$json = '{
"query" : {
"match" : {
"testField" : "abc"
}
}
}';
$params = [
'index' => 'my_index',
'type' => 'my_type',
'body' => $json
];
$results = $client->search($params);
注:这种写法在php客户端能执行成功。
d.)应用到自己的项目如下:
if($user_input){
$json = '{
"query":{
"multi_match":{
"query":"通过改变橡皮筋的长度来改变拉力做功的数值",
"fields":[
"text",
"content"
]
}
}
}';
$params= array(
'index' => 'dzplib',
'type' => $index_type,
'body' => $json
);
$response= $client->search($params);
print_r($response);
}
e.)改成数组方式如下:
if($user_input){
$params= array(
'index' => 'dzplib',
'type' => $index_type,
'body' => array(
'query' => array('multi_match'=>
array('query'=>$user_input,'fields'=>array('text','content'))),
'highlight' => array(
'fields' => array(
$index_field => new \stdClass()
)
),
'size'=>3, //可以限制输出的结果个数
)
);
$response= $client->search($params);
print_r($response);
}
1.2 给Problem的elementName设中文分词ik
1)描述:
现在作用在选项上,是实现了,但效果并不好。就是说我把四个选项全写上,搜题搜索不出来。我分析原因在于:答案和解析里面有elementContent;因此,我想到的优化策略是:在搜索中去掉答案和解析中的检索。
2)在Problem的elementName中加入ik
成功了,但遇到二个问题。一是必须要先建个索引dzplib,之后再更新dzplib;二是类型Problem中加入了elementName的ik,那Paper中elementName也要加ik,否则,不能更新成功。另外,如果说没删除数据库的话,就更新,会说elementName已存在,不能对其进行更新。因为我设置的状态是不能动态更新("dynamic":"false")
2017年3月28日星期二