//搜索框具体的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. Nmap工具介绍

    使用方法 实例: nmap -v scanme.nmap.org 这个选项扫描主机scanme.nmap.org中 所有的保留TCP端口.选项-v启用细节模式. nmap -sS -O scanme. ...

  2. pytest.mark.parametrize()参数化的应用一

    from page.LoginPage import Loginpage import os, sys, pytest base_dir = os.path.dirname(os.path.dirna ...

  3. spring的控制器如何传递数据到视图

    1.控制器代码 2.传递数据代码 model.addAttribute("name", name); 通过model对象传递

  4. 使用 pyenv 可以在一个系统中安装多个python版本

    Installl related yum install readline readline-devel readline-static -y yum install openssl openssl- ...

  5. navicat破解版的下载与激活

    原文链接:http://www.cnblogs.com/djwhome/p/9289295.html 以前一直使用的老版的破解版的navicat,但是最近老是报错 而且连接还特别慢,今天终于不忙了额, ...

  6. Bloom Filter布隆过滤器原理和实现(1)

    引子 <数学之美>介绍布隆过滤器非常经典: 在日常生活中,包括设计计算机软件时,经常要判断一个元素是否在一个集合中.比如: 在字处理软件中,需要检查一个英语单词是否拼写正确(也就是要判断它 ...

  7. 在Linux环境下的对启动服务进行停止或在运行

    下面我以elasticsearch服务为例进行: 第一种: 1.前台运行: 运行结果 2.ctrl+c停止运行   第二种:后端运行 1.后端运行的命令./elasticsearch -d 这种启动后 ...

  8. (五)mybatis开发dao层

    目录 SqlSession 是线程不安全的 原始 dao 开发方法 Mapper 代理方法 关于代理对象 SqlSession 是线程不安全的 SqlSession 是 线程不安全 的: 对于它,我们 ...

  9. Ubuntu18.04中安装Python3.7教程

    Ubuntu18.04中安装Python3.7教程 链接https://blog.csdn.net/weixin_42056625/article/details/82970358

  10. 最大流Dinic(模板)

    #define IOS ios_base::sync_with_stdio(0); cin.tie(0); #include <cstdio>//sprintf islower isupp ...