//搜索框具体的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. 【OpenCV开发】使用OpenCV的OpenCL(ocl)模块

    参加OpenCV的OpenCL模块(以下称OCL)移植工作已经有2个月了.这里我说移植而不是开发,是因为大部分OCL模块的函数都是从已经很成熟的GPU模块移植过来的.于是目前阶段OCL模块所支持的函数 ...

  2. Odoo13 新功能:委外

    [ADD] mrp_subcontracting In a few words, it allows to send components to a subcontractor partner and ...

  3. 计算1-9总共九个数字可以满足abc+def=hij这样的式子

    计算1-9总共九个数字可以满足abc+def=hij这样的式子:其中abcdefghij九个数字各个都不相同,它们都属于1-9个数字中: 首先,第一种方法很简单很暴力,直接枚举,这样的话时间复杂度高: ...

  4. 《你必须知道的495个C语言问题》读书笔记之第4-7章:指针

    1. Q:为什么我不能对void *指针进行算术运算? A:因为编译器不知道所值对象的大小,而指针的算法运算总是基于所指对象的大小的. 2. Q:C语言可以“按引用传参”吗? A:不可以.严格来说,C ...

  5. String类基础的那些事!

    第三阶段 JAVA常见对象的学习 第一章 常见对象--String类 (一) String 类的概述及其构造方法 (1) 概述 多个字符组成的一串数据,例如 "abc" 也可以看成 ...

  6. Django soft-delete软删除

    在django中,实现这个功能很简单,我们采用一个字段用来保存删除的时间.若记录没有被删除,那么设置该值为None,如果被删除,那么设置时间为删除的时间. class BaseSchema(model ...

  7. 【转帖】lmbench的简单使用

    https://www.cnblogs.com/mutong1228/p/10485840.html 下载地址 http://www.bitmover.com/lmbench/ tar -zxvf l ...

  8. DDL数据库对象管理

    DDL数据库对象管理 约束的分类: 主键约束:primary key 要求主键列数据唯一,并且不允许为空. 外键约束:foreign key 用于在两表之间建立关系,需要指定引用主表的哪一列. 检查约 ...

  9. 我学会了正确的dinic

    以前写Isap的时候,总是被卡,然后学了一发Isap的当前弧优化,好像可以水过很多题 但是一直没明白为啥Isap会走一个环??? 然后写dinic了,听说不容易被卡(来自去年九省联考的指导) 然而-- ...

  10. (十六)JDBC 处理大数据

    目录 前言: 基本概念 对于Mysql的Text类型 流地址的写法 blob类型数据 备注 前言: 在实际开发中,程序需要把 大文本或二进制 数据保存到数据库中: 实际上,我们并不存储大的数据到数据库 ...