弹性找不到带撇号的单词(')

时间:2016-08-03 12:09:45

标签: python elasticsearch

我试图用撇号找到包含单词的句子。所以,在文中

  

如果你问外国人一些典型的英国菜,他们   可能会说鱼和薯条然后停下来。令人失望的是,   但事实是,英国没有吃饭的传统   餐馆,因为我们的食物不适合这种准备。   英国的烹饪是在家里找到的,在那里可以计时   菜肴要完美。所以很难找到一个好的英语   价格合理的餐厅

我试着找

  

发现这是令人失望的,但事实是,没有传统   英国人在餐馆吃饭,因为我们的食物没有。

我创建了查询

{
"_index": "liza_index",
"_type": ".percolator",
"_id": "1594",
"_version": 37,
"found": true,
"_source": {
    "query": {
        "bool": {
            "minimum_should_match": 1,
            "should": {
                "span_or": {
                    "clauses": [{
                        "span_near": {
                            "in_order": true,
                            "clauses": [{
                                "span_multi": {
                                    "match": {
                                        "regexp": {
                                            "message": "it"
                                        }
                                    }
                                }
                            }, {
                                "span_multi": {
                                    "match": {
                                        "regexp": {
                                            "message": "is"
                                        }
                                    }
                                }
                            }, {
                                "span_multi": {
                                    "match": {
                                        "regexp": {
                                            "message": "disappointing"
                                        }
                                    }
                                }
                            }, {
                                "span_multi": {
                                    "match": {
                                        "regexp": {
                                            "message": "but"
                                        }
                                    }
                                }
                            }, {
                                "span_multi": {
                                    "match": {
                                        "regexp": {
                                            "message": "true"
                                        }
                                    }
                                }
                            }, {
                                "span_multi": {
                                    "match": {
                                        "regexp": {
                                            "message": "that"
                                        }
                                    }
                                }
                            }, {
                                "span_multi": {
                                    "match": {
                                        "regexp": {
                                            "message": "there"
                                        }
                                    }
                                }
                            }, {
                                "span_multi": {
                                    "match": {
                                        "regexp": {
                                            "message": "is"
                                        }
                                    }
                                }
                            }, {
                                "span_multi": {
                                    "match": {
                                        "regexp": {
                                            "message": "no"
                                        }
                                    }
                                }
                            }, {
                                "span_multi": {
                                    "match": {
                                        "regexp": {
                                            "message": "tradition"
                                        }
                                    }
                                }
                            }, {
                                "span_multi": {
                                    "match": {
                                        "regexp": {
                                            "message": "in"
                                        }
                                    }
                                }
                            }, {
                                "span_multi": {
                                    "match": {
                                        "regexp": {
                                            "message": "britain"
                                        }
                                    }
                                }
                            }, {
                                "span_multi": {
                                    "match": {
                                        "regexp": {
                                            "message": "of"
                                        }
                                    }
                                }
                            }, {
                                "span_multi": {
                                    "match": {
                                        "regexp": {
                                            "message": "eating"
                                        }
                                    }
                                }
                            }, {
                                "span_multi": {
                                    "match": {
                                        "regexp": {
                                            "message": "in"
                                        }
                                    }
                                }
                            }, {
                                "span_multi": {
                                    "match": {
                                        "regexp": {
                                            "message": "restaurants"
                                        }
                                    }
                                }
                            }, {
                                "span_multi": {
                                    "match": {
                                        "regexp": {
                                            "message": "because"
                                        }
                                    }
                                }
                            }, {
                                "span_multi": {
                                    "match": {
                                        "regexp": {
                                            "message": "our"
                                        }
                                    }
                                }
                            }, {
                                "span_multi": {
                                    "match": {
                                        "regexp": {
                                            "message": "food"
                                        }
                                    }
                                }
                            }, {
                                "span_multi": {
                                    "match": {
                                        "regexp": {
                                            "message": "doesn't"
                                        }
                                    }
                                }
                            }],
                            "slop": 0,
                            "collect_payloads": false
                        }
                    }]
                }
            }
        }
    }
}}

但是Elastic没有找到它。没有“不”,查询就可以工作。

我试图在撇号之前添加反斜杠 - “没有”无效,所以我做了“没有”和“没有”。但它不起作用。

顺便说一句,我创建了一个带有反斜杠并且没有

的单词“不”的查询
{
"_index": "liza_index",
"_type": ".percolator",
"_id": "2101",
"_version": 31,
"found": true,
"_source": {
    "query": {
        "bool": {
            "minimum_should_match": 1,
            "should": {
                "span_or": {
                    "clauses": [{
                        "span_multi": {
                            "match": {
                                "regexp": {
                                    "message": "doesn't"
                                }
                            }
                        }
                    }]
                }
            }
        }
    }
}}

它也不起作用。同时以下查询工作

curl -XPUT 'localhost:9200/liza_index/.percolator/1' -d '{"query" : {"match" : {"message" : "doesn't"}}}'

curl -XPUT 'localhost:9200/liza_index/.percolator/1' -d '{"query" : {"match" : {"message" : "doesn\\'t"}}}'

问题是:如何用撇号找到这个词?我应该使用第一个查询的结构创建什么样的查询?

1 个答案:

答案 0 :(得分:0)

  

“最难的是在黑暗的房间里找到一只黑猫,   特别是如果没有猫。“

     

- 孔子

Elasticsearch执行收到的standard analysis and curation数据。它删除了大多数标点符号。如果您使用匹配查询,您将通过相同的策展流程传递您的查询,它将起作用(将删除查询中的所有标点符号)。 Regexp查询不是策划的。这就是为什么它找不到撇号。

您可以使用 match_phrase

而不是生成复杂的正则表达式查询
curl -XPOST "http://esarchive.local:9200/liza_index/.percolator/_search" -d'
{
  "query": {
    "match_phrase": {
      "message": "find it is disappointing, but true, that there is no tradition in britain of eating in restaurants, because our food doesn\"t"
    }
  }
}'

或创建自定义分析器/映射器以保留标点符号