本文作者:qiaoqingyi

聚合搜索源码(全网搜索源码)

qiaoqingyi 2023-02-07 602

今天给各位分享聚合搜索源码的知识,其中也会对全网搜索源码进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

114la网址导航和丫头网址导航为什么一样

丫头网址导航,使用的正是我们的源码!

114啦网址导航是目前国内使用率最高的网址导航之一,为了答谢一直以来支持和喜欢本站的站长朋友,同时也是为了传递互联网的分享精神,2009年6月27日,雨林木风旗下114啦网址导航发布了其自主研发的《114啦网址导航建站系统》源码。114啦网址导航开源将帮助更多站长轻松搭建网址导航网站,让更多的网民得到优秀的网址导航服务。此外,本站还将适时发布新版本和更新数据库,并将适时发布专为网址导航定制的各类插件。

114啦网址导航建站系统V1.13是从V1.12版本改进而来,通过对1.12版本站长反馈的bug修复,并对程序进行了整体优化,增强程序兼容性,提高了运行效率;本次版本的重大改进还有增加了在线升级功能,站长可以及时在线修复bug,并能得到官方的最新消息;对模板引擎进行了重构,并提供了多个模版,真正方便站长进行模板制作,我们也将不定时制作作新模版发布;改善了网址导航的网址分类和网址管理方式,能最高效的管理站点;支持直接贴入搜索联盟代码等……本程序从建站始到站点更新维护力求贴近草根站长需求。

欢迎各位站长升级使用。由于测试环境有限,可能会出现一些bug,也请您及时反馈(Bug收集贴),我们将及时修复,并通过在线更新系统发布程序补丁包。雨林木风竭诚为广大站长服务!

114啦网址导航建站系统主要特性:

采用Php+Mysql架构,搭建简易,程序运行稳定安全

集成114啦网址导航最新数据库,收录站点质量高

全站可见链接99%后台控制,站长可随心所欲定制

全站采用XHTML+CSS设计,符合W3C标准

一键全站html静态页生成,可完全脱离数据库运行

功能强大的多用户权限管理,可委任多个权限组进行站点维护

分类清晰人性化,可自定义分类链接、可外链,更符合seo标准

全站链接可设置上线时间、过期时间、颜色定制、留空、网站备注等,方便广告需要

提供多种风格的皮肤、天气预报、日历等个性化功能

集成115聚合搜索、百度、Google等引擎入口,全方位搜索体验

提供站内网址搜索、网站浏览记录等功能

系统安全设置:安全验证、系统负载控制、CC防护设置、IP禁止……将风险防患于未然

整合网站收录申请查询、用户反馈等程序,便于了解网友需求,有助于改善用户体验

完善的数据库管理,可进行在线数据库备份、恢复、优化及修复

全面的日志管理:后台管理安全日志、MYSQL、PHP错误日志,便于程序监控和操作记录

visualstudio2012计算代码?

VS2005,2003和2002的开源行计数器可在此处获得:

此处还讨论了创建一个计算VS插件的行,在Codeproject上完成代码

另外Slick Edit Gadgets有一个很好的行计数器,这里:

和Microsoft Visual Studio Team System 2008包括一个良好的行计数器。

请记住:

通过代码行测量编程进度就像按重量测量飞机构建进度一样。 比尔盖茨

#3楼

在Visual Studio Team System 2008中,您可以从菜单Analyze - 'Calculate Code Metrics for Solution'中进行操作,它将为您提供整个解决方案的行数(除其他外g )

#4楼

我发现powershell对此很有用。 我认为LoC无论如何都是一个非常虚假的指标,所以我不相信任何更正式的要求。

从一个小的解决方案的目录:

PS C:\Path (gci -include *.cs,*.xaml -recurse | select-string .).Count

8396

PS C:\Path

这将计算所有解决方案的.cs和.xaml文件中的非空行。 对于更大的项目,我只使用了不同的扩展名列表:

PS C:\Other (gci -include *.cs,*.cpp,*.h,*.idl,*.asmx -recurse | select-string .).Count

909402

PS C:\Other

为什么在单个命令行执行时会使用整个应用程序? :)

#5楼

cloc是一个出色的命令行,基于Perl的Windows可执行文件,它将分解按文件格式分组的空白行,注释行和源代码行。

现在它不会专门在VS解决方案文件上运行,但它可以通过目录递归,您可以根据需要设置文件名过滤器。

以下是其网页的示例输出:

prompt cloc perl-5.10.0.tar.gz

4076 text files.

3883 unique files.

1521 files ignored.

v 1.07 T=10.0 s (251.0 files/s, 84566.5 lines/s)

-------------------------------------------------------------------------------

Language files blank comment code scale 3rd gen. equiv

-------------------------------------------------------------------------------

Perl 2052 110356 112521 309778 x 4.00 = 1239112.00

C 135 18718 22862 140483 x 0.77 = 108171.91

C/C++ Header 147 7650 12093 44042 x 1.00 = 44042.00

Bourne Shell 116 3402 5789 36882 x 3.81 = 140520.42

Lisp 1 684 2242 7515 x 1.25 = 9393.75

make 7 498 473 2044 x 2.50 = 5110.00

C++ 10 312 277 2000 x 1.51 = 3020.00

XML 26 231 0 1972 x 1.90 = 3746.80

yacc 2 128 97 1549 x 1.51 = 2338.99

YAML 2 2 0 489 x 0.90 = 440.10

DOS Batch 11 85 50 322 x 0.63 = 202.86

HTML 1 19 2 98 x 1.90 = 186.20

-------------------------------------------------------------------------------

SUM: 2510 142085 156406 547174 x 2.84 = 1556285.03

-------------------------------------------------------------------------------

第三代等效量表是对第三代语言所需代码量的粗略估计。 不是非常有用,但无论如何都很有趣。

#6楼

这里的答案有点过时,可能来自vs 2008时间。 因为在较新的Visual Studio版本2010/2012中,此功能已内置。 因此,没有理由使用任何扩展或工具。

计算代码行的功能 - 计算指标。 有了它,您可以计算每个项目或解决方案的指标(LOC,维护指数,Cyclomatic指数,继承深度)。

在解决方案资源管理器中右键单击解决方案或项目

并选择“计算指标”

以后可以将用于分析和聚合的数据导入Excel。 同样在Excel中,您可以过滤掉生成的类或指标中的其他噪音。 这些指标(包括代码行LOC)也可以在构建过程中收集,并包含在构建报告中

#7楼

显然工具更容易,但我觉得很酷在powershell :)

此脚本查找.sln文件中的所有.csproj引用,然后在每个csproj文件中找到包含在编译中的文件。 对于包含在编译中的每个文件,它会创建一个具有属性的对象:Solution,Project,File,Lines。 它将所有这些对象存储在列表中,然后根据需要对数据进行分组和投影。

#path to the solution file e.g. "D:\Code\Test.sln"

$slnFile = "D:\Code\Test.sln"

#results

$results = @()

#iterate through .csproj references in solution file

foreach($projLines in get-item $slnFile | Get-Content | Select-String '".*csproj')

{

$projFile = [System.IO.Path]::Combine([System.IO.Path]::GetDirectoryName($slnFile), [regex]::Match($projLines,'[^"]*csproj').Value)

$projFolder = [System.IO.Path]::GetDirectoryName($projFile)

#from csproj file: get lines for files to compile Compile Include="..."/

$includeLines = get-item $projFile | Get-Content | Select-String 'Compile Include'

#count of all files lines in project

$linesInProject = 0;

foreach($fileLine in $includeLines)

{

$includedFilePath = [System.IO.Path]::Combine($projFolder, [Regex]::Match($fileLine, '"(?file.*)"').Groups["file"].Value)

$lineCountInFile = (Get-Content $includedFilePath).Count

$results+=New-Object PSObject -Property @{ Solution=$slnFile ;Project=$projFile; File=$includedFilePath; Lines=$lineCountInFile }

}

}

#filter out any files we dont need

$results = $results | ?{!($_.File -match "Designer")}

#print out:

"---------------lines per solution--------------"

$results | group Solution | %{$_.Name + ": " + ($_.Group | Measure-Object Lines -Sum).Sum}

"---------------lines per peoject--------------"

$results | group Project | %{$_.Name + ": " + ($_.Group | Measure-Object Lines -Sum).Sum}

#8楼

这是Trick ..它也计算Js文件。

#9楼

正则表达式在VS2010和2012之间发生了变化,因此这里的大多数正则表达式解决方案都不再有效

(^(?!(\s*//.+)))+(^(?!(#.+)))+(^(?!(\s*\{.+)))+(^(?!(\s*\}.+)))+(^(?!(\s*\r?$)))+

将找到所有非空白的行,不仅仅是一个括号('{'或'}'),而不仅仅是#include或其他预处理器。

使用Ctrl - shift - f并确保启用正则表达式。

VS 2010及更早版本的相应正则表达式为

^~(:Wh@//.+)~(:Wh@\{:Wh@)~(:Wh@\}:Wh@)~(:Wh@/#).+

#10楼

以下是Visual Studio 2012/2013/2015的更新,适用于那些想要执行“查找”选项(我认为最简单)的人:此RegEx将查找包含多个排除项的所有非空白行,以提供最准确的结果。

在“查找”框中输入以下RegEx。 请务必选择“使用正则表达式”选项。 根据您的需要将搜索选项更改为“当前项目”或“整个解决方案”。 现在选择“全部查找”。 在“ 查找结果”窗口的底部,您将看到“匹配行”,即代码行数。

^(?!(\s*\*))(?!(\s*\-\-\))(?!(\s*\\!\-\-))(?!(\s*\n))(?!(\s*\*\/))(?!(\s*\/\*))(?!(\s*\/\/\/))(?!(\s*\/\/))(?!(\s*\}))(?!(\s*\{))(?!(\s(using))).*$

此RegEx不包括以下项目:

评论

// This is a comment

多行注释(假设行正确注释,每行前面有*)

/* I am a

* multi-line

* comment */

用于智能感知的XML

/// summary

/// I'm a class description for Intellisense

/// /summary

HTML评论:

!-- I am a HTML Comment --

使用陈述:

using System;

using System.Web;

打开花括号:

{

闭合花括号:

}

注意:大括号之间的任何内容都将包含在搜索中,但在此示例中,只计算4行代码,而不是18个实际的非空白行:

public class Test

{

/// summary

/// Do Stuff

/// /summary

public Test()

{

TestMe();

}

public void TestMe()

{

//Do Stuff Here

/* And

* Do

* Stuff

* Here */

}

}

我创建了这个以给我一个比以前的选项更准确的LOC计数,并认为我会分享。 老板喜欢LOC计数,所以我坚持了一段时间。 我希望其他人可以找到这个有用的,如果您有任何问题或需要帮助让它工作,请告诉我。

#11楼

其他简单工具适用于VS2008(开源): http : //

#12楼

您可以使用免费工具SourceMonitor

提供了许多措施:代码行,语句计数,复杂性,块深度

通过图表输出图形

#13楼

您可以使用Visual Studio代码指标PowerTool 10.0 。 它是一个命令行实用程序,可以为您计算托管代码的一些指标(包括代码行)。 您可以获得一个VS 2010插件, 将该工具引入Visual Studio ,并使其快速选择菜单项并单击“Analyze Solution”。

#14楼

找到这个提示: LOC与VS查找和替换

不是插件,如果这就是你要找的东西。

#15楼

一个简单的解决方案是搜索所有文件。 使用通配符时键入“*”。 哪个会匹配所有线路。 在查找结果窗口的末尾,您应该看到排序的一行:

Matching lines: 563 Matching files: 17 Total files searched: 17

当然,这对于大型项目来说并不是很好,因为所有行都被配对并加载到内存中以便在查找结果窗口中显示。

参考:

高级示例

#16楼

我更喜欢OxyProject Metrics VS Addin。

#17楼

尝试neptuner。 除了LoC之外,它还为您提供空格,制表符,注释行等内容。

#18楼

在Visual Studio 2015中,转到“分析”菜单,然后选择“计算代码度量标准”。

#19楼

Visual Studio 2010 Ultimate具有此内置功能。

分析 - 计算代码度量标准

#20楼

您可以在Visual Studio 2010中使用Project Line Counter加载项。通常它不能与Visual Studio 2010一起使用,但它可以使用有用的.reg文件: http : //。 PHP?CMD = newsitem及评论= news.1.41.0

#21楼

使用Visual Studio 2010 Ultimate中的菜单 - 分析 - 计算代码度量标准选项。

#22楼

我想出了一个快速而脏的PowerShell脚本,用于计算文件夹结构中的行数。 它不像其他答案中引用的其他工具那样功能齐全,但我认为在项目或解决方案中提供相对于彼此的代码文件大小的粗略比较是足够好的。

脚本可以在这里找到:

#23楼

我用了Ctrl + Shift + F. 接下来,在搜索框中输入\\n并启用正则表达式框。 然后在查找结果中,在屏幕的末尾是搜索到的文件数和找到的代码行。

#24楼

同意Ali Parr。 WndTab Line Counter addin就是这样一个工具。

从下载站点搜索以查找一些相关工具也是一个好主意。 ;tag=srch

#25楼

对于未来的读者,我想建议Visual Studio 2010的DPack扩展 。

它内置了大量的实用程序,包括一个行计数器,它表示有多少行是空白的,代码等等。

原文链接:

什么叫长尾关键词?

长尾关键词是指网站上非目标关键词但也可以带来搜索流量的关键词,称为长尾关键词。 长尾关键词的特征是比较长,往往是2-3个词组成,甚至是短语,存在于内容页面,除了内容页的标题,还存在于内容中。 搜索量非常少,并且不稳定。 长尾关键词带来的客户,转化为网站产品客户的概率比目标关键词高很多。 存在大量长尾关键词的大中型网站,其带来的总流量非常大。长尾关键词基本属性是:可延伸性,针对性强,范围广.

一是与企业产品或者网站定位精确度高的词语,此类关键词针对一些有明确目标需求的搜索引擎引入的用户,这类人群是对你所经营的网站产品有着明确认知程度的人群,但是这部分人群是网站流量的一小部分。大概占据网站整体流量的20%左右;

二是产品或者网站业务扩展出来的关键词,这是面向对你经营的网站或产品有着模糊概念的访问人群设计的关键词。这块流量估计占整体网站搜索引擎流量的30%左右;

三是即将有可能成为搜索用户使用并且找到网站的关键词,这类关键词语可以理解为比较长尾性关键词语,可能是业务的周边产品的延伸词,或者是与网站内容扩展出的相关词,这块流量估计占整体网站搜索引擎流量的20%左右。

我们可以以"三亚旅游"这个关键词作为基本关键词进行扩展。

如:针对性比较强的关键词"三亚蜈支洲""三亚蜈支洲旅游体会"等;

相关拓展的关键词"三亚宾馆""三亚旅游费用"等;

周边产品的延伸词"北京到三亚机票""北京到三亚打折机票""三亚旅行社""三亚就餐推荐"等。

以上以三类长尾词进行了简单列举。

聚合搜索源码(全网搜索源码)

如何用 Node.js 和 Elasticsearch 构建搜索引擎

安装 Elasticsearch

Elasticsearch 受Apache 2许可证保护,可以被下载,使用,免费修改。安装Elasticsearch 之前你需要先确保在你的电脑上安装了Java Runtime Environment (JRE) ,Elasticsearch 是使用java实现的并且依赖java库运行。你可以使用下面的命令行来检测你是否安装了java

推荐使用java最新的稳定版本(写这篇文章的时候是1.8)。你可以在找到在你系统上安装java的指导手册。

接下来是下载最新版本的Elasticsearch (写这篇文章的时候是2.3.5),去下载ZIP 文件。Elasticsearch 不需要安装,一个zip文件就包含了可在所有支持的系统上运行的文件。解压下载的文件,就完成了。有几种其他的方式运行Elasticsearch ,比如:获得TAR 文件或者为不同Linux发行版本的包。

如果你使用的是Mac操作系统并且安装了 ,你就可以使用这行命令安装Elasticsearch brew install elasticsearch.Homebrew 会自动添加executables 到你的系统并且安装所需的服务。它也可以使用一行命令帮你更新应用:brew upgrade elasticsearch.

想在Windows上运行Elasticsearch ,可以在解压的文件夹里,通过命令行运行bin\elasticsearch.bat 。对于其他系统,可以从终端运行 ./bin/elasticsearch.这时候,Elasticsearch 就应该可以在你的系统上运行了。

就像我之前提到的,你可以使用Elasticsearch的几乎所有的操作,都可以通过RESTful APIs完成。Elasticsearch 默认使用9200 端口。为了确保你正确的运行了Elasticsearch。在你的浏览器中打开 ,将会显示一些关于你运行的实例的基本信息。

图形用户界面

Elasticsearch不须图形用户界面,只通过REST APIs就提供了几乎所有的功能。然而如果我不介绍怎么通过APIs和 Node.js执行所有所需的操作,你可以通过几个提供了索引和数据的可视化信息GUI工具来完成,这些工具甚至含有一些高水平的分析。

, 是同一家公司开发的工具, 它提供了数据的实时概要,并提供了一些可视化定制和分析选项。Kibana 是免费的。

还有一些是社区开发的工具,如 , , 甚至谷歌浏览器的扩展组件.这些工具可以帮你在浏览器中查看你的索引和数据,甚至可以试运行不同的搜索和汇总查询。所有这些工具提供了安装和使用的攻略。

创建一个Node.js环境

弹性搜索为Node.js提供一个官方模块,称为elasticsearch。首先,你需要添加模块到你的工程目录下,并且保存依赖以备以后使用。

然后,你可以在脚本里导入模块,如下所示:

最终,你需要创建客户端来处理与弹性搜索的通讯。在这种情况下,我假设你正在运行弹性搜索的本地机器IP地址是127.0.0.1,端口是9200(默认设置)。

注意:这篇导读的所有源代码都可以在GitHub下载查看。最简单的查看方式是在你的PC机上克隆仓库,并且从那里运行示例代码:

数据导入

在本教程中,我将使用 1000 篇学术论文里的内容,这些内容是根据随机算法逐一生成的,并以 JSON 格式提供,其中的数据格式如下所示:

JSON 格式中的每个字段如字面意思,无需多余解释,但值得注意的是:由于body包含随机生成的文章的全部的内容(大概有100~200个段落),所以并未展示。

虽然 Elasticsearch 提供了,、单个数据的方法,但我们采用接口导入数据,因为批量接口在大型数据集上执行操作的效率更高。

这里,我们调用函数bulkIndex建立索引,并传入 3 个参数,分别是:索引名 library,类型名library,JSON 数据格式变量 articles。bulkIndex函数自身则通过调用esClient对象的bulk接口实现,bulk 方法包含一个body属性的对象参数,并且每个body属性值是一个包含 2 种操作实体的数组对象。第一个实体是 JSON 格式的操作类型对象,该对象中的index属性决定了操作的类型(本例子是文件索引)、索引名、文件ID。第二个实体则是文件对象本身。

注意,后续可采用同样的方式,为其他类型文件(如书籍或者报告)添加索引。我们还可以有选择的每个文件分配一个唯一的ID,如果不体统唯一的ID,Elasticsearch 将主动为每个文件分配一个随机的唯一ID。

假设你已经从代码库中下载了 Elasticsearch 项目代码,在项目根目录下执行如下命令,即可将数据导入至Elasticsearch中:

检查数据的索引是否准确

Elasticsearch 最大的特性是接近实时检索,这意味着,一旦文档索引建立完成,1 秒内就可被检索(见)。索引一旦建立完成,则可通过运行 indice.js 检查索引信息的准确性():

client 中的cat 对象方法提供当前运行实例的各种信息。其中的 indices 方法列出所有的索引信息,包括每个索引的健康状态、以及占用的磁盘大小。 而其中的 v 选项为 cat方法新增头部响应。

当运行上面代码段,您会发现,集群的健康状态被不同的颜色标示。其中,红色表示为正常运行的有问题集群;黄色表示集群可运行,但存在告警;绿色表示集群正常运行。在本地运行上面的代码段,您极有可能(取决于您的配置)看到集群的健康状态颜色是黄色,这是因为默认的集群设置包含 5 个节点,但本地运行只有 1 个实例正常运行。鉴于本教程的目的仅局限于 Elasticsearch 指导学习,黄色即可。但在线上环境中,你必须确保集群的健康状态颜色是绿色的。

动态和自定义映射

如前所述, Elasticsearch 无模式(schema-free),这意味着,在数据导入之前,您无需定义数据的结构(类似于SQL数据库需要预先定义表结构),Elasticsearch 会主动检测。尽管 Elasticsearch 被定义为无模式,但数据结构上仍有些限制。

Elasticsearch 以映射的方式引用数据结构。当数据索引建立完成后,如果映射不存在,Elasticsearch 会依次检索 JSON 数据的每个字段,然后基于被字段的类型(type)自动生成映射(mapping)。如果存在该字段的映射,则会确保按照同样的映射规则新增数据。否则直接报错。

比如:如果{"key1": 12} 已经存在,Elasticsearch 自动将字段 key1 映射为长整型。现在如果你尝试通过{"key1": "value1", "key2": "value2"} 检索, 则会直接报错,因为系统预期字段 key1 为长整型。同时,如果通过 {"key1": 13, "key2": "value2"} 检索则不会报错,并为字段 key2 新增 string 类型。

映射不能超出文本的范围,大都数情况下,系统自动生成的映射都可正常运行。

构建搜索引擎

一旦完成数据索引,我们就可以开始实现搜索引擎。Elasticsearch提供了一个直观的基于JSON的全搜索查询的结构-Query DSL,定义查询。有许多有用的搜索查询类型,但是在这篇文章中,我们将只看到几个通用的类型。关于Query DSL的完整文章可以在看到。

请记住,我提供了每个展示例子的源码的连接。设置完你的环境和索引测试数据后,你可以下载源码,然后运行在你的机器上运行任何例子。可以通过命令行运行节点filename.js。

返回一个或多个索引的所有记录

为了执行我们的搜索,我们将使用客户端提供的多种搜索方法。最简单的查询是match_all,它可以返回一个或多个索引的所有的记录。下面的例子显示了我们怎么样获取在一个索引中获取所有存储的记录().

主要的搜索查询包含在Query对象中。就像我们接下来看到的那样,我们可以添加不同的搜索查询类型到这个对象。我们可以为每一个Query添加一个查询类型的关键字(如match_all),让这个Query成为一个包含搜索选项的对象。由于我们想返回索引的所有记录,所以在这个例子中没有查询选项。

除了Query对象,搜索体中可以包含其他选项的属性,如 size 和from。size属性决定了返回记录的数量。如果这个值不存在,默认返回10个记录。from属性决定了返回记录的起始索引,这对分页有用。

理解查询API的返回结果

如果你打印搜索API返回结果(上面例子的结果)日志。由于它包含了很多信息,刚开始看起来无所适从。

在最高级别日志输出里,返回结果中含有took 属性,该属性值表示查找结果所用的毫秒数,timed_out只有在最大允许时间内没有找到结果时为true,_shards 是不同节点的状态的信息(如果部署的是节点集群),hits是查询结果。

hits的属性值是一个含有下列属性的对象:

total —表示匹配的条目的总数量

max_score — 找到的条目的最大分数

hits — 找到的条目的数组,在hits数组里的每一天记录,都有索引,类型,文档,ID,分数,和记录本身(在_source元素内)。

这十分复杂,但是好消息是一旦你实现了一个提取结果的方法,不管你的搜索查询结果时什么,你都可以使用相同的格式获取结果。

还需要注意的是Elasticsearch 有一个好处是它自动地给每一个匹配记录分配分数,这个分数用来量化文件的关联性,返回结果的顺序默认的按钮分数倒排。在例子中我们使用match_all取回了所有的记录,分数是没有意义的,所有的分数都被计算为1.0。

匹配含指定字段值的文档

现在我们看几个更加有趣的例子. 我们可以通过使用 match 关键字查询文档是否与指定的字段值匹配。一个最简单的包含 match 关键字的检索主体代码如下所示:

如上文所述, 首先通过为查询对象新增一个条目,并指定检索类型,上面示例给的是 match 。然后再检索类型对象里面,申明待检索的文档对象,本例是 title 文档对象。然后再文档对象里面,提供相关检索数据,和 query 属性。我希望你测试过上述示例之后,惊讶于 Elasticsearch 的检索效率。

上述示例执行成功后,将返回title(标题)字段与任一 query 属性词匹配的所有文档信息。同时还可以参考如下示例,为查询对象附加最小匹配数量条件:

与该查询匹配的文档 title(标题)字段至少包含上诉指定的 3 个关键词。如果查询关键词少于 3个,那么匹配文档的 title(标题)字段必须包含所有的查询词。Elasticsearch 的另一个有用的功能是 fuzziness(模糊匹配).这对于用户输入错误的查询词将非常有用,因为fuzzy(模糊匹配)将发现拼写错误并给出最接近词供选择。对于字符串类型,每个关键字的模糊匹配值是根据算法 算出的最大允许值。fuzziness(模糊匹配)示例如下所示:

多个字段搜索

如果你想在多个字段中搜索,可以使用multi_match搜索类型。除了Query对象中的fields属性外,它同match有点类似。fields属性是需要搜索的字段的集合。这里我们将在title,authors.firstname, 和authors.lastname 字段中搜索。

multi_match查询支持其他搜索属性,如minimum_should_match 和fuzziness。Elasticsearch支持使用通配符(如*)匹配字段,那么我们可以使用['title', 'authors.*name']把上面的例子变得更短些。

匹配一个完整的句子

Elasticsearch也支持精确的匹配一个输入的句子,而不是在单词级别。这个查询是在普通的match 查询上扩展而来,叫做 match_phrase。下面是一个match_phrase的例子

联合多个查询

到目前为止,在例子中我们每次请求只使用了单个查询。然而Elasticsearch允许你联合多个查询。最常用的复合查询是bool,bool查询接受4种关键类型must, should, must_not, 和filter. 像它们的名字表示的那样,在查询结果的数据里必须匹配must里的查询,必须不匹配must_not里的查询,如果哪个数据匹配should里的查询,它就会获得高分。每一个提到的元素可以使用查询数组格式接受多个搜索查询。

下面,我们使用bool查询及一个新的叫做query_string的查询类型。它允许你使用 AND 或 OR写一些比较高级的查询。另外,我们使用了 range查询,它可以让我们通过给定的范围的方式去限制一个字段。

在上面的例子中,查询返回的数据,作者的名包含term1 或它们的姓包含term2,并且它们的title含有term3,而且它们不在2011,2012或2013年出版的,还有在body字段里含有给定句子数据将获得高分,并被排列到结果的前面(由于在should从句中的match 查询)。

过滤,聚合,和建议

除了它先进的搜索功能外,Elasticsearch 还提供了其他的功能。接下来,我们再看看其他三个比较常用的功能。

过滤

也许,你经常想使用特定的条件凝缩查询结果。Elasticsearch通过filters 提供了这样的功能。在我们的文章数据里,假设你的查询返回了几个文章,这些文章是你选择的在5个具体年份发布的文章。你可以简单的从搜索结果中过滤出那些不匹配条件的数据,而不改变查询结果的顺序。

在bool 查询的must 从句中,过滤和相同查询之间的不同之处在于,过滤不会影响搜索分数,而must 查询会。当查询结果返回并且用户使用给定的条件过滤时,他们不想改变结果的顺序,相反地,他们只想从结果中移除不相关的数据。过滤与搜索的格式一样,但在通常情况下,他们在有明确值的字段上定义,而不是文本字符串上。Elasticsearch 推荐通过bool复合查询的filter从句添加过滤。

继续看上面的例子,假设我们想把搜索结果限制在在2011到2015年之间发布的文章里。这样做,我们只需要在一般搜索查询的filter 部分添加range 查询。这将会从结果中移除那些不匹配的数据。下面是一个过滤查询的例子

聚合

聚合框架会基于一次搜索查询,提供各种聚合数据和统计信息。两个主要的聚合类型是度量和分块, 度量聚合会对一个文档的集合进行持续的跟踪并计算度量,而分块聚合则会进行块的构建,每个块都会跟一个键和一个文档查询条件关联起来。度量聚合的示例有平均值,最小值,最大值,加总值还有计数值。分块聚合的示例有范围、日期范围、直方图以及主题项。对聚合器更加深入的描述可以在 找到。

聚合可以放置在一个 aggregations 对象里面,而对象自己则是被直接放到 search 对象体中。在 aggregations 对象里面,每一个键都是由用户赋予一个聚合器的名称。聚合器的类型和其它选项都应该是作为这个键的值而放置的。接下来我们要来看看两个不同类型的聚合器,一个是度量的,一个块的。我们会用度量聚合器来尝试找出数据集合中最小的年份值(也就是最久远的文章),而使用块集合器我要做的就是尝试找出每一个关键词各自出现了多少次。

在上述示例中,我们将度量聚合器命名为 min_year (也可以是其它名称), 也就是 year 这个域上的 min 类型。块聚合器责备命名为 keywords, 就是 keywords 这个域上的 terms 类型。聚合操作的结果被装在了响应消息里的 aggregations 元素里面,更深入一点会发现里面包含了每一个聚合器(这里是 min_year 和 keywords)以及它们的聚合操作结果。 如下是来自这个示例响应消息中的部分内容。

响应消息中默认最多会有10个块返回。你可以在请求中 filed 的边上加入一个size键来规定返回的块的最大数量。如果你想要接收到所有的块,可以将这个值设置为 0。

建议

Elasticsearch 提供了多种可以对输入内容提供替换和补全的关联项推荐器(见)。下面将介绍术语和短语推荐器。术语推荐器为每个输入文本中的术语提供关联推荐(如果有的话),而短语推荐器将整个输入文本看做一个短语(与将其拆分成术语对比),然后提供其他短语的推荐(如果有的话)。使用推荐API时,需要调用Node.js client的suggest方法。如下为术语推荐器的示例。

与其他client的方法相同,在请求体中包含一个index字段指明采用的索引。在body字段中添加查询推荐的文本,然后给每个推荐器一个(包含了聚合对象的)名称(本例中的titleSuggester)。其值指明了推荐器的类型和配置。这里,为title字段使用了术语推荐器,限制最大建议的数量是每个token最多5个(size: 5)。

建议API返回的数据中包含了对应请求中每一个建议器的key,其值是一个与你输入文本中术语数量相同的一个数组。对于数组中的每一个元素,包含一个options数组,其每个对象的text字段中包含了推荐的文本。如下是上面例子中返回数据的一部分。

获取短语推荐的时候,采用与上文相同的格式并替换推荐器的类型字段即可。如下的例子中,返回数据将与上例格式相同。

聚合搜索源码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于全网搜索源码、聚合搜索源码的信息别忘了在本站进行查找喔。

阅读
分享