Elasticsearch FullText Query

默认是全部field进行搜索_all ; 可以明确指定某个field;支持分词等
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)

、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)

高级查询


一种略高级的查询,充分考虑了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");


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)

猜你喜欢

转载自sanniangmiao.iteye.com/blog/2339506