//搜索框具体的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. Public thanks to Shao Qirui for his contribution to open source software

    Public thanks to Shao Qirui for his contribution to open source softwareShao Qirui is a student, but ...

  2. K/3 Cloud 单据关联查询

    销售出库单 下推 销售退货单,如何获知他们的关联关系?T_SAL_OUTSTOCKENTRY 是销售出库单分录T_SAL_RETURNSTOCKENTRY 是销售退货单分录T_SAL_RETURNST ...

  3. C++.控制台_界面颜色

    1.c++中system(_color )怎样用?-CSDN论坛.html(https://bbs.csdn.net/topics/390758320) 2. 2.1. 颜色属性由两个十六进制数字指定 ...

  4. HttpHelper帮助类

    public class HttpHelper { #region 预定义方变量 //默认的编码 private Encoding _encoding = Encoding.Default; //Po ...

  5. Spring 视图层如何显示验证消息提示

    1.示例 <p th:if="${#fields.hasErrors('name')}" th:errors="*{name}" ></p&g ...

  6. 解决java.lang.SecurityException: Invalid signature file digest for Manifest main attributes

    解决java.lang.SecurityException: Invalid signature file digest for Manifest main attributes 当项目依赖其他jar ...

  7. 初识RedisCluster集群

    为什么需要Redis集群 需要提高更大的并发量 Redis官方提出拥有10万QPS的请求量 如果业务需要Redis拥有100万的QPS 可以通过集群来提升并发量. 需要存储更大的数据量 一般服务器的机 ...

  8. Python 解LeetCode:23. Merge k Sorted Lists

    题目描述:把k个排序的链表组成的列表合并成一个排序的链表 思路: 使用堆排序,遍历列表,把每个列表中链表的头指针的值和头指针本身作为一个元素放在堆中: 第一步中遍历完列表后,此时堆中最多会有n个元素, ...

  9. 为什么要使用 SPL中的 SplQueue实现队列

    今天看php的SPL标准库部分里面涉及到数据结构其中有 SplQueue 来实现队列效果,但是我刚接触php的时候学习到的是 使用array的 array_push 和 array_pop 就可以实现 ...

  10. Vue路由传参及传参后刷新导致参数消失处理

    项目功能需要,要从列表页跳转到第三方提供的URL上(这里第三方页面我是通过iframe引入在详情页,目的是点击返回时可以通过keepAlive让列表页不刷新,如果不通过iframe直接跳第三方链接,那 ...