简单查询搜索是否与带状疱疹兼容?

时间:2015-12-17 23:35:27

标签: elasticsearch shingles

我想知道是否可以使用带有简单查询字符串查询的带状符。我对相关字段的映射如下所示:

{
    "text_2": {
        "type": "string",
        "analyzer": "shingle_analyzer"
    }
}

分析仪和过滤器定义如下:

"analyzer": {
    "shingle_analyzer": {
        "type": "custom",
        "tokenizer": "standard",
        "filter": ["standard", "custom_delimiter", "lowercase", "stop", "snowball", "filter_shingle"]
    }
},
"filter": {
    "filter_shingle":{
       "type":"shingle",
       "max_shingle_size":5,
       "min_shingle_size":2,
       "output_unigrams":"true"
    },
    "custom_delimiter": {
        "type": "word_delimiter",
        "preserve_original": True
    }
}

我正在执行以下搜索:

{
    "query": {
        "bool": {
            "must": [
                {
                    "simple_query_string": {
                        "analyzer": "shingle_analyzer",
                        "fields": [
                            "text_2"
                        ],
                        "lenient": "false",
                        "default_operator": "and",
                        "query": "porsches small red"
                    }
                }
            ]
        }
    }
}

现在,我有一个text_2 = small red porsches的文档。由于我使用AND运算符,我希望我的文档不匹配,因为上面的查询应该产生一个小的红色",这是一个不同的顺序。但是,当我看到比赛解释时,我只看到单个单词标记" red" "小" "保时捷",当然匹配。

SQS是否与带状疱疹不相容?

1 个答案:

答案 0 :(得分:2)

答案是"是的,但是......"。

鉴于text_2字段可能在您的映射中具有标准索引分析器(根据您正在查看的解释),即您所看到的内容是正常的,即唯一的令牌small red porschessmallredporsches已制作并编入索引。

在查询方面,您可能正在使用将output_unigrams设置为true(默认)的shingle分析器,这意味着除了bigrams之外还将生成unigram标记(同样根据你所看到的解释)。那些unigrams是你获得比赛的唯一原因。如果你想在bigrams上匹配,那么一个解决方案是在索引时使用 ,以便可以生成bigrams small redred porsches并将其编入索引除了un smallredporsches之外还有其他内容。

然后在查询时,unigrams也会匹配,但small red bigram肯定会匹配。为了只匹配双字母组合,您可以使用另一个shingle分析器,仅用于output_unigrams设置为false的查询时间,这样只有bigrams才能从搜索输入中生成。如果您的查询只包含一个单词(例如porsches),那么该shingle分析器只会生成一个单字组(因为output_unigrams_if_no_shingles为真)并且查询仍然匹配您的文档。如果不满意,您只需在shingle搜索分析器中将output_unigrams_if_no_shingles设置为false