您的位置:首页 > 产品设计 > UI/UE

Elasticsearch FullText Query

2016-06-30 17:48 585 查看
1、matchQuery

查询的内容会通过分词,分词后的数据进行检索,只要包含其中一个分词就会被检索出来

QueryBuilders.matchQuery("hotelName", "test林")

2、matchPhraseQuery

查询的内容通过分词,严格按照分词的出现的顺序进行查询,也就是必须包含所有分词,且出现数据一致,

QueryBuilders.matchPhraseQuery("hotelName", "智售试酒").slop(2)

总结:

是否分词后查询,前提(查询的字段是进行分词索引的,如果不是分词索引则不生效)

例如 hotelName 包含值: 'test' 'test three' 'three' 'test one three' '林test' 'test yang three'

查询短语为 test three

对比
**matchQuery **: 能够查询出来 全部内容

mathPhraseQuery :只能够查询出来 test three 这一个数据 因为'test yang three' 三个词包含了 'test' 和 'three' 但是他们之间有一个 'yang'这个分词所以没匹配上

那如何让查询也把'test yang three'呢?

slop(1),1含义是两个分词之间可以最多还有其他1个分词,这时就能够查询到'test yang three'

如果想也查询到'test yang ss three' slop则应该slop(2)

其他参数可以自己摸索,如设置分词器等。设置operator and或者or 控制分词的查询的关系

//分词后AND关系,必须同时包含所有分词

QueryBuilders.matchQuery("hotelName","test林").operator(MatchQueryBuilder.Operator.AND)

//分词后OR关系,至少包含一个分词

QueryBuilders.matchQuery("hotelName","test林").operator(MatchQueryBuilder.Operator.OR)

3、multi-match query

多字段检索,检索相同的内容

type对内容相关度会有一定的影响,根据你的应用场景来分析你的查询写法

type 默认是 best_fields

best_fields :score为匹配的字段的最大值;

** most_fields** :score为每个字段分值的总和;

cross_field :score为将字段合并为一个整个大字段,获得的分值

QueryBuilders.multiMatchQuery("beijing test","hotelName","hotelNo").operator(MatchQueryBuilder.Operator.OR)

**4、common term query **

一种略高级的查询,充分考虑了stop-word的低优先级,提高了查询精确性。他将查询短语分词,将分词后的term分为高频词和低频词

高频词(也可以理解为stopwords)比如 的,个,是 ;英文的 the is 等 无意义且出现频率极高的词

**低频词 **就是我们要时间查询的词,比如酒店 宾馆等

查询过程:通过匹配低频词检索出我们需要的数据,然后在这个基础上继续匹配高频词,既能完成检索数据又能充分匹配高频词

因为我们可能搜索词 happy 和 not happy 如果不匹配高频词 搜索的结果将会是一样的 显然这不是我们需要的

举例如果想要能够匹配如下 "hotelName":"新增的第一个酒店"

QueryBuilders.commonTermsQuery("hotelName","的酒个店").cutoffFrequency(0.001f)

cutoffFrequency 设置高频词的score因子

5、query string

默认是全部field进行搜索_all ; 可以明确指定某个field;支持分词等

QueryString 被分词 默认分词之间是OR 关系, 支持 AND OR 来决定每个term之间的关系;同时 支持通配符,正则 等操作

如下查询 hotelName 字段 查询 QueryString 为 "四 AND 酒 AND 店 " 查询结果是 hotelName 同时包含 "四" "酒" "店"
如果不明确 AND 则是OR的关系,包含任意一个term即被命中

QueryBuilder queryBuilder = QueryBuilders.queryStringQuery("四 AND 酒 AND  店 ").defaultField("hotelName");

6、 simple query string

简单查询

支持符号操作,不像query string那样支持正则等表达式

支持的符号如: + 表示 AND , | 表示 OR , - 表示 否 还有其他支持符号就查看文档吧

flag 明确指定支持的符号有哪些,

查询 hotelName 字段 查询 simpleQueryString 为 "四+酒+店 " 查询结果是 hotelName 同时包含 "四" "酒" "店"

QueryBuilders.simpleQueryStringQuery("四+酒+店").field("hotelName")

下面看下flag 的作用,flag 明确指明 支持OR操作,此时 + 不生效,三个词是默认的 OR关系

QueryBuilders.simpleQueryStringQuery("四+酒+店").field("hotelName").flags(SimpleQueryStringFlag.OR)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息