弹性搜索中词组匹配的问题

时间:2013-10-08 22:07:33

标签: elasticsearch

我正在尝试使用elasticsearch执行短语匹配。

以下是我要完成的事情:

data - 1: {
    "test" {
       "title" : "text1 text2"
    }
}

2: {
    "test" {
       "title" : "text3 text4"
    }
}

3: {
    "test" {
       "title" : "text5"
    }
}


4: {
    "test" {
       "title" : "text6"
    }
} 

搜索字词:

如果我查找“text0 text1 text2 text3” - 它应该返回#1(匹配完整字符串)

如果我查找“text6 text5 text4 text3” - 它应该返回#4,#3,而不是#2,因为它的顺序不同。

这是我尝试过的:

  • index_analyzer设置为关键字,将search_analyzer设置为标准
  • 也尝试创建自定义令牌

但我的解决方案都没有允许我从搜索查询中查找文档中的关键字的子字符串匹配。

如果有人编写了类似的查询,您能否提供如何配置映射以及使用了哪种查询。

1 个答案:

答案 0 :(得分:2)

我在这里看到的是:您希望搜索匹配查询发送的任何令牌。如果这些令牌匹配,则必须与标题完全匹配。

这意味着将标题字段索引为关键字可以获得强制匹配。但是,搜索的标准分析器永远不会与标题空间匹配,因为您拥有索引标记{"text1 text2"}和搜索标记[{"text1},{"text2"}]。您不能将词组匹配与任何草率值匹配,否则您的令牌订单要求将被忽略。

因此,您真正需要的是在索引期间生成关键字标记,但是您需要在搜索时生成带状疱疹。你的带状疱疹将维持秩序,如果其中一个匹配,请考虑一下。我会设置不输出unigrams,但如果没有带状疱疹,确实允许unigrams。这意味着如果你只有一个单词,它将输出该标记,但是如果它可以将你的搜索单词组合成不同数量的叠加标记,它就不会发出单个单词标记。

PUT
  { "settings":
    {
        "analysis": {
            "filter": {
                "my_shingle": {
                    "type": "shingle",
                    "max_shingle_size": 50,
                    "output_unigrams": false
                }
            },
            "analyzer": {
                "my_shingler": {
                    "filter": [
                        "lowercase",
                        "asciifolding",
                        "my_shingle"
                    ],
                    "type": "custom",
                    "tokenizer": "whitespace"
                }
            }
        }
    }
}

Then you just want to set your type mapping to use the keyword analyzer for index and the `my_shingler` analyzer for search.

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis-shingle-tokenfilter.html

相关问题