短语匹配
短语匹配故名思意就是对分词后的短语就是匹配,而不是仅仅对单独的单词进行匹配
下面就是根据下面的脚本例子来看整个短语匹配的有哪些作用和优点
GET /my_index/my_type/_search
{
"query": {
"match_phrase": {
"title": "quick brown fox"
}
}
}
//查询分词之后连续的
//例如 brown fox 可以查询到,但是quick fox 查询不到
//也可以使用下面的方式,这两种方式是相同的,只不过写法不同而已
POST /product/_search
{
"query": {
"match": {
"name":{
"query": "1130 对接",
"type": "phrase"
}
}
}
}
根据上面的我们对短语匹配有些总结
- quick 、 brown 和 fox 需要全部出现在域中
- brown 的位置应该比 quick 的位置大 1
- fox 的位置应该比 quick 的位置大 2
- 上面任何一个选项不成立,则该文档不能认定为匹配
对 短语查询进行一些优化
通过加入slop参数,可以灵活的控制短语查询的,
slop 参数告诉 match_phrase 查询词条相隔多远时仍然能将文档视为匹配
POST product/_search
{
"query": {
"match_phrase": {
"name": {
"query": "1130 对接 测试",
"slop" : 10
}
}
}
}
越近越好,当我们给一个短语查询设置了很高的额slop时,就像下面这样
POST product/_search
{
"query": {
"match_phrase": {
"name": {
"query": " 上海 自由行",
"slop" : 100
}
}
}
}
//但是虽然我们给了很高的slop值,我们可以根据返回的score分数值来进行判断几个字段是否更加的临近。
部分匹配
- prefix 前缀查询
前缀查询,就是将一个词从头开始查。 例如某个数据是上海一日游 可利用前缀查询查询 上海
POST /product/_search
{
"query": {
"prefix": {
"departureCitys": {
"value": "上"
}
}·
}
}
prefix 前缀查询,不会在搜索的时候分析字符串,它假定传入的字符串就是正要查询的前缀
**默认状态下, prefix 查询不做相关度评分计算,它只是将所有匹配的文档返回,并为每条结果赋予评分值 1 **
- 前缀搜索的步骤
- 扫描词列表,并查找第一个关键词
- 收集关联的文档id
- 移动到下一个词。
- 如果这个词也是以 关键字开头,查询跳回到第二步再重复执行,直到下一个词不以关键字 为止。
Elasticsearch - 理解字段分析过程(_analyze与_explain)
- _explain 用来帮助分析文档的relevance score是如何计算出来
- GET /product/_analyze?text="自由行", 使用默认的额analyze来分析自由行
- 指定的analyzer来分析 例如 GET /product/_analyze ?analyzer=pinyin_analyzer&text=" 自由行"
- 指定field的analyzer来分析 GET /product/_analyze?field=base.name&text=" 自由行"
- _analyze用来分析每一个field或者某个analyzer/tokenizer是如何分析和索引一段文字
- 使用_explain向ElasticSearch询问庆于该文档是如何匹配(或者没有匹配上)的解释信息
POST /product/_search
{
"explain": true,
"size": 1,
"query": {
"match": {
"name": "三亚"
}
}
}
查询时输入即搜索
match_phrase_prefix 查询, 短语查询和前缀查询的组合
GET /product/_search
{
"query": {
"match_phrase_prefix": {
"name": {
"query": "上 海",
"slop" : 20,
"max_expansions": 50
}
}
}
}
slop 来使整个词序位置不是那么的严格
参数 max_expansions 控制着可以与前缀匹配的词的数量
Elasticsearch进行search查询的过程中,出现了Result window is too large错误
- ES默认窗口10000。可以用修改index.max_result_window参数来解决问题
- curl -XPUT http://127.0.0.1:9200/product/_settings -d '{ "index" : { "max_result_window" : 100000}}'