这个字段决定当前
token
相对于上一个
token
的位置
(
当前
token
的位置就是上一个
token
位置的值与
positionIncrement
的值的和
),
它的作用主要体现在短语查询
(phrase search)
中
.
一般它的默认值是
1.
但是可以把它设置为
0
或者大于
1
的值
,
起作用分别如下
:
1.
当设置为
0
的时候是一个词有多个词干的情况下
(
这里指英文
).
短语查询对短语中的两个词之间的其它词的数量是有严格要求的
,
如果想进行严格匹配就可能限制为
0,
即两个词必须紧紧相连
.
这样如果不认为一个词产生的若干词干是在同一位置
,
就相当于认为他们是不同的词了
,
从而导致无法正确的匹配
.
举个例子说明
,
如果在建立索引的过程中出现了
bound to
这个句子
,
我们在对
bound
处理的时候会提取出两个词干
,
一个是
bound
本身
,
一个是
bond.
这个时候如果不进行特殊处理
,
保持
positionIncrement
的值不变
,
则由于提取出了两个词干导致先提取出的词干与
to
的位置间隔不为
1
了
,
而是
2.
这样在我们进行短语查询
”bound to”
时
(
假设先提出的词干是
bound),
由于在建立好的索引中
bound
和
to
之间的相对距离为
2,
所以将不会返回结果
,
这样就导致了一种可能错误的结果
,
即用户希望查询时任何一个词干匹配成功都返回结果
,
而此时却不能实现
.
但是如果在处理
bound
产生的两个词干时把
positionIncrement
的值设置为
0,
则就会防止这种现象出现
,
因为两个词干中的任何一个与
to
的距离都是
1;
2.
当设置为大于
1
的值的时候是两个词中间有一个或多个停用词的情况下
.
在建立索引的过程中
,
两个词中间的停用此被去掉了
,
如果不进行特殊处理
,
则可能导致原本是被其它词分隔开的两个词的距离为
1
了
,
因为这两个词之间的其它词都是停用词
(a,an,the,are
之类的
)
被过滤掉了
.
在这种情况下可能会出现在短语查询时本来是不应该匹配的却出现了返回结果
,
举个例子说明
:
如果在建立索引的过程中
,
如果有这样一段话
:my name is steven,name steven
在建立索引的过程中
,
由于
is
是停用词被过滤掉了
,
如果不进行特殊处理
,
则导致第一对
name
和
steven
之间的相对距离是
1,
这样在查询
”name steven”
时
,
会出现两个匹配
,
但是我们并不想要这个匹配
,
而只想要第二个匹配
,
这样就出现了错误的结果
,
导致结果不准切多
;
这个时候如果在处理第一对
name
和
steven
时把
positionIncrement
的值设置为
2,
则就不会出现这种结果了
;
3.
综上所述
,
当设置为
0
时候是为了增加有效的匹配
,
使得返回的结果更准
;
在设置为大于
1
时
,
是为了减少错误的匹配
,
同样也是为了返回结果更加可信
.