我正在使用停用词启用某些文字的索引,我想使用"匹配词组"来搜索这些文字。查询没有slop,但看起来停顿词仍然考虑到术语位置。
建筑指数:
PUT /fr_articles
{
"settings": {
"analysis": {
"analyzer": {
"stop": {
"type": "standard",
"stopwords" : ["the"]
}
}
}
},
"mappings": {
"test": {
"properties": {
"title": {
"type": "string",
"analyzer": "stop"
}
}
}
}
}
添加文档:
POST /fr_articles/test/1
{
"title" : "Tom the king of Toulon!"
}
搜索:
POST /fr_articles/_search
{
"fields": [
"title"
],
"explain": true,
"query": {
"match": {
"title": {
"query": "tom king",
"type" : "phrase"
}
}
}
}
什么都没找到; - (
有没有办法解决它?或者可能有多个跨度查询,但我希望该术语彼此接近。
谢谢你,
答案 0 :(得分:4)
位置增量会导致此问题,是的。虽然停用词可能已经消失且无法搜索,但它仍然无法将这两个词推到彼此旁边,因此查询"tom the king"
既未找到"tom king"
也未找到"such that tom will not be their king"
。
通常情况下,当您使用过滤器删除分析中的某些内容时,它并不像从未出现过那样。特别是StopFilter
的目的是删除由不感兴趣的术语导致的搜索命中。它不是要改变文件或句子的结构。
您以前可以在StopFilter
上禁用位置增量,但该选项已被删除,自Lucene 4.4起。
好的,忘了CharFilter tomfoolery。丑陋的黑客,不要这样做。
要在不使用位置增量的情况下进行查询,您需要在查询解析器中进行查询,而不是在分析中进行配置。这可以在elasticsearch中完成,Query String Query,enable_position_increments
设置为false。
类似的东西:
{
"query_string" : {
"default_field" : "title",
"query" : "\"tom king\""
"enable_position_increments" : false
}
}
作为一个兴趣点,在原始Lucene中使用类似的解决方案,设置QueryParser.setEnablePositionIncrements
。
答案 1 :(得分:0)
您可以设置一个选项enable_position_increments: false
,例如在一个停止过滤器中,但自Lucene 4.4以来它已被弃用
这是相关的Lucene问题:https://issues.apache.org/jira/browse/LUCENE-4065
换句话说,目前最好的方法可能是使用slop选项,直到修复Lucene问题