2014-09-04 39 views
1

问题是做为两个相邻的单词的短语的搜索与分析的话任意的顺序。elasticsearch:短语搜索以任意顺序的两个相邻字(分析)

E.g.在Sphinx extended syntax terms查询字符串可以写为WordToBeAnalyzed1 NEAR/1 WordToBeAnalyzed2。然后这两个单词都被分析,并且搜索引擎发现“Word1 Word2”或“Word2 Word1”,其中两个单词可以以任何形式出现(例如“狐狸跳跃”,“跳跃狐狸”,“狐狸跳跃”等等)。

读ES文档我无法表达的ES查询DSL相同的搜索。

match_phraseslop查询我可以查询一个短语"WordToBeAnalyzed1 WordToBeAnalyzed2""slop": 2参数去match same words in reverse order。但它也会匹配“Word1 SlopWord1 Word2”和“Word1 SlopWord1 SlopWord2 Word2”等不良变体。

我还试图用span_near查询与in_order PARAM,但

span queries are term-level queries, so they have no analysis phase

我会很高兴,如果有人可以点我的方式来解决这个问题。

+1

我从来没有能够找到这个'正确'的方式。过去我们使用了一些解决方法来模仿这一点。一种是在另一个字段(如伪分析器)中对短语中的令牌进行排序,并在搜索时应用相同的排序。另一种方法是将令牌存储为数组并进行术语查询。 – coffeeaddict 2014-09-04 21:47:39

+0

@coffeeaddict谢谢,但看起来我无法正确理解您的解决方法,或者我们正在尝试解决不同的问题。 在索引字符串中对令牌排序,例如“word2 word4 word1 word3”将产生以下一个顺序索引的术语:“word1 word2 word3 word4”。让我们假设需要用任何词序查询词组“word4 word1”。建议的分析器将查询改为'“word1 word4”',但问题是在索引文本“word1”和“word4”有2个单词的距离,所以查询将失败。 你怎么看待'term'查询的单词顺序? – 2014-09-05 08:24:11

+0

是的,你是对的。我应该首先要求澄清你的要求:(我以为你试图做的词组类型匹配索引短语和搜索词组之间的相等数量的记号(只是不是以相同的顺序)。你仍然可以如果您的搜索字词短于索引字词,则可以查询条件,其中minimum_should_match设置为搜索字词中的标记数量。搜索项比索引项 – coffeeaddict 2014-09-05 17:07:23

回答

2

约首先通过明确要求运行查询到_analyze API,那么span_near查询什么?

+0

感谢您解决方法如果没有可能在单个查询请求中执行此操作,我可能会明确使用分析器 – 2014-09-05 07:59:35

+0

我的应用程序中有一组固定的查询根据从关系数据库获取的数据生成。因此,我只能分析一次所有字符串,并从数据库中进行“span_near”查询。 – 2014-09-05 08:07:24

+0

另一个解决方法。也许是出于性能的考虑,当查询事先不知道这将是更好的查询这两种型号:'“WordToBeAnalyzed1 WordToBeAnalyzed2”'和'“WordToBeAnalyzed2 WordToBeAnalyzed1”'在单个查询(被证明这需要测试)。 但不是在我的情况(见前面的评论)。 – 2014-09-05 08:31:00