[Elasticsearch] 多字段搜索 (六) - 自定义_all字段,跨域查询及精确值字段

自定义_all字段 在元数据:_all字段中,我们解释了特殊的_all字段会将其它所有字段中的值作为一个大字符串进行索引。尽管将所有字段的值作为一个字段进行索引并不是非常灵活。如果有一个自定义的_all字段用来索引人名,另外一个自定义的_all字段用来索引地址就更好了。 ES通过字段映射中的copy_to参数向我们提供了这一功能: PUT /my_index { "mappings": { "person": { "properties": { "first_name": { "type": "string", "copy_t...

继续阅读 »

[Elasticsearch] 多字段搜索 (五) - 以字段为中心的查询

以字段为中心的查询(Field-centric Queries) 上述提到的三个问题都来源于most_fields是以字段为中心(Field-centric),而不是以词条为中心(Term-centric):它会查询最多匹配的字段(Most matching fields),而我们真正感兴趣的最匹配的词条(Most matching terms)。 NOTEbest_fields同样是以字段为中心的,因此它也存在相似的问题。 首先我们来看看为什么存在这些问题,以及如何解决它们。 问题1:在多个字段中匹配相同的单词 考虑一下most_fields查询是如何执行的:ES会为每个字段生成一个match查询,让后将它们包含在一个bool查询中。 我们可以将查询传入到validate-query AP...

继续阅读 »

[Elasticsearch] 多字段搜索 (四) - 跨字段实体搜索

跨字段实体搜索(Cross-fields Entity Search) 现在让我们看看一个常见的模式:跨字段实体搜索。类似person,product或者address这样的实体,它们的信息会分散到多个字段中。我们或许有一个person实体被索引如下: { "firstname": "Peter", "lastname": "Smith" } 而address实体则是像下面这样: { "street": "5 Poland Street", "city": "London", "country": "United Kingdom", "postcode": "W1V 3DG" } 这个例子也许很像在多查询字符串中描述的,但是...

继续阅读 »

[Elasticsearch] 多字段搜索 (三) - multi_match查询和多数字段

multi_match查询 multi_match查询提供了一个简便的方法用来对多个字段执行相同的查询。 NOTE 存在几种类型的multi_match查询,其中的3种正好和在"了解你的数据"一节中提到的几种类型相同:best_fields,most_fields以及cross_fields。 默认情况下,该查询以best_fields类型执行,它会为每个字段生成一个match查询,然后将这些查询包含在一个dis_max查询中。下面的dis_max查询: { "dis_max": { "queries": [ { "match": { "title": { "query": "Quick brown fox...

继续阅读 »

[Elasticsearch] 多字段搜索 (二) - 最佳字段查询及其调优

最佳字段(Best Fields) 假设我们有一个让用户搜索博客文章的网站,就像这两份文档一样: PUT /my_index/my_type/1 { "title": "Quick brown rabbits", "body": "Brown rabbits are commonly seen." } PUT /my_index/my_type/2 { "title": "Keeping pets healthy", "body": "My quick brown fox eats rabbits on a regular basis." } 用户输入了"Brown fox",然后按下了搜索键。我们无法预先知道用户搜索的词条会出现在博文的title或者b...

继续阅读 »

[Elasticsearch] 多字段搜索 (一) - 多个及单个查询字符串

多字段搜索(Multifield Search) 本文翻译自官方指南的Multifield Search一章。 查询很少是只拥有一个match查询子句的查询。我们经常需要对一个或者多个字段使用相同或者不同的查询字符串进行搜索,这意味着我们需要将多个查询子句和它们得到的相关度分值以一种有意义的方式进行合并。 也许我们正在寻找一本名为战争与和平的书,它的作者是Leo Tolstoy。也许我们正在使用“最少应该匹配(Minimum Should Match)”来搜索ES中的文档。另外我们也可能会寻找拥有名为John而姓为Smith的用户。 在本章中我们会讨论一些构建多字段搜索的工具,以及如何根据你的实际情况来决定使用哪种方案。 多个查询字符串(Multiple Query Strings) 处理字...

继续阅读 »

Java解析搜索词库

解析算法摘自:http://qindongliang.iteye.com/blog/2088416 最近在优化社区搜索结果,之前使用的词库比较老旧很多次都收录不全,所以想到了搜狗输入法词库。但是搜索输入法词库文件是加密之后的,去网上找了一个Java版的解析程序,经测试可用,这里搜藏一下。 package cn.mucang.saturn.common; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.file.Files; import java.nio.file.LinkOption; import java.nio.file.Paths; ...

继续阅读 »