//搜索框具体的ajax如下:

<form class="form-wrapper cf">
<img src="__PUBLIC__/Home/img/shousuo.png" id="sousuo" style="position:absolute;margin-left:5px;height:20px;width:20px;margin-top:47px;text-align:center;" alt="">
<input type="text" id="content" style="height:42px;width:535px;margin-top:30px; padding-left:26px;" placeholder="输入问题搜索一下" required>

<button type="button" id="submitSearch" class="abutton">搜索一下
</button>
</form>

<script>
$(function () {
// 联想
$("#content").autocomplete({
contentType : 'application/x-www-form-urlencoded; charset=utf-8',
source: function(request,response){
$.ajax({
url: "{:U('Index/get_complation')}",
data: {keyword: $('#content').val()},
dataType: "json",
type: "post",
success: function (data) {
response($.map(data, function(item) {
return item;
}));
}
});
}
});
// 点击搜索
$('#submitSearch').click(function () {
// 获取输入框的值
var title = $('#content').val();
search(title);
});
});
function search(title){
$.ajax({
url: "{:U('Index/get_question')}",
data: {title: title},
dataType: "json",
type: "post",
success: function (data) {
if(data.status == -1){

$('.soucontent').hide();
$('#search-no-result').show();
}else{
$('#search-no-result').hide();
// 显示问题详情
$('.soucontent').show();
$('#detail-title').html(data.title); // 标题
$('#detail-content').html(data.content); // 内容
}
}
});
}
</script>

  封装搜索类(这里的搜索类没有用到数据库规定的分数,运用搜索的分数进行运算最后得出的排名):

     

<?php
/**
* Created by PhpStorm.
* User: nihuan
* Date: 16-12-17
* Time: 下午1:32
* Desc: 搜索方法类
*/
namespace Org\Util;
require '/alidata/webroot/elasticsearch/xiaodu/EsPHP/vendor/autoload.php';

class EsSearch
{
private $DEFAULT_SCORE_KEYWORD = 50;
private $DEFAULT_SCORE_TITLE = 40;
private $DEFAULT_SCORE_CONTENT = 30;

private $index = 'xiaodu';
private $es;

public function __construct()
{
Vendor('Elasticsearch.autoload');
$hosts = [
 
 
'192.168.1.1:9201',
'192.168.1.2:9201',
'192.168.1.3:9201'
];
$params['hosts'] = $hosts;
//连接ES服务器
$this->es = new \Elasticsearch\Client($params);
}

/**
* 搜索提示列表
* @Version 1.0
* @Date 16-12-17
* @param array $elastic
* @param $page
* @return array
*/
public function complation($elastic = array(), $page)
{
$text = array();
$keyword = $this->extractArgument($elastic, 'keyword');
$type = $this->extractArgument($elastic, 'type');
$field = $this->extractArgument($elastic, 'field');
$params['index'] = $this->index;
$format_keyword = $this->formatKeyword($keyword);
if ($format_keyword == $keyword) {
$params['body'] = array(
$type . '-suggest' => array(
'text' => $keyword,
'completion' => array(
'field' => $field,
'size' => $page
)
)
);
} else {
$params['body'] = array(
$type . '-suggest' => array(
'text' => $keyword,
'completion' => array(
'field' => 'keyword_pinyin_suggest',
'size' => $page
)
)
);
}
$result = $this->es->suggest($params);
if ($result[$type . '-suggest'] != false) {
foreach ($result[$type . '-suggest'][0]['options'] as $key => $value) {
$text[$key] = trim($value['text']);
}
}
return $text;
}

// public function question($elastic = array(),$size,$page = 0)
// {
//// $data = $others = [];
// $resultArray = [];
// $keyword = $this->extractArgument($elastic, 'keyword');
// $type = $this->extractArgument($elastic, 'type');
// $params = [
// 'index' => $this->index,
// 'type' => $type,
// 'from' => $page,
// 'size' => $size
// ];
// $params['body']['sort'] = array(
// '_score' => array(
// 'order' => 'desc'
// )
// );
// $must = [];
// if (!empty($keyword)) {
// array_push($must, array(
// 'multi_match' => array(
// 'query' => $keyword,
// 'fields' => array('keyword', 'title^2', 'content'),
// 'operator' => 'or'
// )
// ));
// }
// $params['body']['query']['bool']['must'] = $must;
// $result = $this->es->search($params);
//// if($result != false){
//// $current_result = current($result['hits']['hits']);
//// if(!empty($current_result)){
//// $data['title'] = $current_result['_source']['title'];
//// $data['content'] = str_replace("&nbsp;", "", strip_tags($current_result['_source']['content']));;
////// $data['asid'] = (int)$current_result['_source']['asid'];
//// $data['ask_id'] = (int)$current_result['_source']['asid'];
//// $data['fenshu'] = (int)$current_result['_source']['fenshu'];
//// }
//// unset($result['hits']['hits'][0]);
// foreach ($result['hits']['hits'] as $key => $val) {
//// array_push($others,['asid' => (int)$val['_source']['asid'], 'other_title' => $val['_source']['title']]);
// array_push($resultArray, ['id' => (int)$val['_source']['asid'], 'title' => $val['_source']['title'], 'fenshu' => $val['_source']['fenshu']]);
// }
// // }
//// return ['info' => $data, 'others' => $others];
// return $resultArray;
// }

public function questionKeyword($elastic, $searchField)
{
// $keyword = $elastic['keyword'];
// $type = $elastic['type'];
$keyword = $this->extractArgument($elastic, 'keyword');
$type = $this->extractArgument($elastic, 'type');

$params = [
'index' => $this->index,
'type' => $type,
'from' => 0,
'size' => 100
];
$params['body']['sort'] = array(
'_score' => array(
'order' => 'desc'
)
);
$must = [];
if (!empty($keyword)) {
array_push($must, array(
'multi_match' => array(
'query' => $keyword,
'fields' => array($searchField),
'operator' => 'and'
)
));
}
$params['body']['query']['bool']['must'] = $must;
$result = $this->es->search($params);
return $result;
}

public function question($elastic, $size, $page)
{
$keyword = $elastic['keyword'];

$resultArray = [];
$params['body']['sort'] = array(
'_score' => array(
'order' => 'desc'
)
);

$resultKeyword = $this->questionKeyword($elastic, 'keywords');
//var_dump($resultKeyword);
$resultTtitle = $this->questionKeyword($elastic, 'title^2');
$resultContent = $this->questionKeyword($elastic, 'content');

$mapResult = array();

foreach ($resultKeyword['hits']['hits'] as $key => $val) {
$keywordsArray = json_decode($val['_source']['keywords_array'], true);
$tempItem = $this->matchKeyword($keywordsArray, $keyword);
$fenshu = $this->DEFAULT_SCORE_KEYWORD;
if($tempItem)
{
$fenshu = $tempItem['fenshu'];
}

if($mapResult[(int)$val['_source']['asid']])
{
continue;
}

$itemResult = array();

$itemResult['id'] = (int)$val['_source']['asid'];
$itemResult['title'] = $val['_source']['title'];
$itemResult['fenshu'] = $val['_source']['fenshu'];
$itemResult['indexScore'] = floatval($fenshu);

array_push($resultArray, $itemResult);

$mapResult[$itemResult['id']] = $itemResult;
}

foreach ($resultTtitle['hits']['hits'] as $key => $val) {
$fenshu = $this->DEFAULT_SCORE_TITLE;

if($mapResult[(int)$val['_source']['asid']])
{
continue;
}

$itemResult = array();

$itemResult['id'] = (int)$val['_source']['asid'];
$itemResult['title'] = $val['_source']['title'];
$itemResult['fenshu'] = $val['_source']['fenshu'];
$itemResult['indexScore'] = floatval($fenshu);

array_push($resultArray, $itemResult);

$mapResult[$itemResult['id']] = $itemResult;
}
foreach ($resultContent['hits']['hits'] as $key => $val) {
$fenshu = $this->DEFAULT_SCORE_CONTENT;

if($mapResult[(int)$val['_source']['asid']])
{
continue;
}

$itemResult = array();

$itemResult['id'] = (int)$val['_source']['asid'];
$itemResult['title'] = $val['_source']['title'];
$itemResult['fenshu'] = $val['_source']['fenshu'];
$itemResult['indexScore'] = floatval($fenshu);

array_push($resultArray, $itemResult);

$mapResult[$itemResult['id']] = $itemResult;
}
$result =$this->sortArrByField($resultArray, 'indexScore', false);
$result = array_slice($result, 0 , $size);
return $result;
}

// 多维数组根据某一个字段 排序
public function sortArrByField(&$array, $field, $desc = false)
{
$fieldArr = array();
foreach ($array as $k => $v) {
$fieldArr[$k] = $v[$field];
}
$sort = $desc == false ? SORT_DESC : SORT_ASC;
array_multisort($fieldArr, $sort, $array);
return $array;
}

/**
* @param array $params
* @param string $arg
*
* @return null|mixed
*/
protected function matchKeyword($keywordsArray, $keyword)
{
if(!$keywordsArray || !$keyword)
{
return null;
}

foreach ($keywordsArray as $key => $item) {
if(strcmp($keyword, $item['keyword']) == 0)
{
return $item;
}
}

return null;
}

/**
* @param array $params
* @param string $arg
*
* @return null|mixed
*/
protected function extractArgument(&$params, $arg)
{
if (is_object($params) === true) {
$params = (array)$params;
}

if (isset($params[$arg]) === true) {
$val = $params[$arg];
unset($params[$arg]);
return $val;
} else {
return null;
}
}

/**
* @param $keyword
* @return string
* 格式化搜索关键词
*/
protected function formatKeyword($keyword)
{
$string = '';
$pattern = '/[^\x00-\x80]/';
if (!preg_match($pattern, $keyword)) {
$numPattern = '/[0-9]/';
if (!preg_match($numPattern, $keyword)) {
$params = "/[^aoeiuv]?h?[iuv]?(ai|ei|ao|ou|er|ang?|eng?|ong|a|o|e|i|u|ng|n)?/";
preg_match_all($params, $keyword, $result);
if (!empty($result[0])) {
foreach ($result[0] as $key => $value) {
if (!empty($value)) {
$string .= $value . ' ';
} else {
continue;
}
}
$string = substr($string, 0, strlen($string) - 1);
}
}
}
$string = empty($string) ? $keyword : $string;
return $string;
}

}

elasticsearch联想加搜索实例的更多相关文章

  1. 分布式搜索ElasticSearch构建集群与简单搜索实例应用

    分布式搜索ElasticSearch构建集群与简单搜索实例应用 关于ElasticSearch不介绍了,直接说应用. 分布式ElasticSearch集群构建的方法. 1.通过在程序中创建一个嵌入es ...

  2. ElasticSearch搜索实例含高亮显示及搜索的特殊字符过滤

    应用说明见代码注解. 1.简单搜索实例展示: public void search() throws IOException { // 自定义集群结点名称 String clusterName = & ...

  3. Python 和 Elasticsearch 构建简易搜索

    Python 和 Elasticsearch 构建简易搜索 作者:白宁超 2019年5月24日17:22:41 导读:件开发最大的麻烦事之一就是环境配置,操作系统设置,各种库和组件的安装.只有它们都正 ...

  4. 笔记13:Python 和 Elasticsearch 构建简易搜索

    Python 和 Elasticsearch 构建简易搜索 1 ES基本介绍 概念介绍 Elasticsearch是一个基于Lucene库的搜索引擎.它提供了一个分布式.支持多租户的全文搜索引擎,它可 ...

  5. elasticsearch集群搭建实例

    elasticsearch集群搭建实例 下个月又开始搞搜索了,几个月没动这块还好没有落下. 晚上在自己虚拟机上搭建了一个简易搜索集群,分享一下. 操作系统环境: Red Hat 4.8.2-16 el ...

  6. 畅购商城(五):Elasticsearch实现商品搜索

    好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航 畅购商城(一):环境搭建 畅购商 ...

  7. Elasticsearch(2) 数据搜索

    本文介绍如何在Elasticsearch中对数据进行搜索. 1.简述 在Elasticsearch中的搜索中,有两类搜索: queries aggregations 区别在于:query可以进行全文搜 ...

  8. ExtJs基础知识总结:自定义弹窗和ComboBox自动联想加载(四)

    概述 Extjs弹窗可以分为消息弹窗.对话框,这些弹窗的方式ExtJs自带的Ext.Msg.alert就已经可以满足简单消息提示,但是相对复杂的提示,比如如何将Ext.grid.Panel的控件显示嵌 ...

  9. elasticsearch的rest搜索--- 查询

    目录: 一.针对这次装B 的解释 二.下载,安装插件elasticsearch-1.7.0   三.索引的mapping 四. 查询 五.对于相关度的大牛的文档 四. 查询 1. 查询的官网的文档   ...

随机推荐

  1. 如何快速在Github找到你想要的东西

    众所周知 Github是全球最大的xx交友平台,虽然被收购了.但是不并没有什么影响. 使用Git可以做很多事,在这里不再缀述,上面的资源也是多种多样,应有尽有 对于这样一个平台,我们想快速找到自己需要 ...

  2. centOS 安装 pm2

    安装 npm install -g pm2 自启 pm2 startup centos 启动 pm2 start server/add.js (以实际路径为准) 其他命令: pm2 list #查看进 ...

  3. Go语言入门篇-gRPC基于golang & java简单实现

    一.什么是RPC 1.简介: RPC:Remote Procedure Call,远程过程调用.简单来说就是两个进程之间的数据交互. 正常服务端的接口服务是提供给用户端(在Web开发中就是浏览器)或者 ...

  4. 模型预测控制 MPC

    使用MPC的原因:

  5. 转载:同一台电脑教你配置多个Tomcat的环境变量

    装两个tomcat 分别是6.0和7.0 可想运行tomcat6.0 但是实际上却运行tomcat7.0 两个版本都是用解压缩包 其实就是不能运行tomcat6.0 只能运行7.0 两个环境变量都配置 ...

  6. EasyUI datagrid 动态加载表头和数据

    首先返回到页面的需要是JSON数据: 第一步: 遍历表头,插入到array中 for (var i = 0; i < jsonObj.title.length; i++) { //把返回的数据封 ...

  7. 文件锁-fcntl flock lockf

    这三个函数的作用都是给文件加锁,那它们有什么区别呢? 首先flock和fcntl是系统调用,而lockf是库函数.lockf实际上是fcntl的封装,所以lockf和fcntl的底层实现是一样的,对文 ...

  8. PHP获取指定时间的前6个月月份 、获取前6天日期

    //获取前6个月月份 public function to_sex_month(){ $today = input('param.today') ? input('param.today') : da ...

  9. Foo Fighters CodeForces - 1148F

    大意: 给定$n$个二元组$(val_i,mask_i)$. 保证$\sum val_i$不为$0$. 要求选择一个数$s$, 对于每个二元组$(val_i,mask_i)$, 若$s\& m ...

  10. 第一讲,DOS头文件格式

    今天讲解PE文件格式的DOS头文件格式 首先我们要理解,什么是文件格式,我们常说的EXE可执行程序,就是一个文件格式,那么我们要了解它里面到底存了什么内容 简短的说明. 我们要知道,PE文件格式,是微 ...