Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何提高elasticsearch中的搜索相关性顺序?_Search_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch_Lucene_Match - Fatal编程技术网 elasticsearch,lucene,match,Search,elasticsearch,Lucene,Match" /> elasticsearch,lucene,match,Search,elasticsearch,Lucene,Match" />

如何提高elasticsearch中的搜索相关性顺序?

如何提高elasticsearch中的搜索相关性顺序?,search,elasticsearch,lucene,match,Search,elasticsearch,Lucene,Match,我有一个名为title的字段,其值如下 苹果iphone6s 苹果iphone6 苹果iphone 6s plus 苹果iphone 苹果iphone5s 所以如果用户搜索 苹果iphone6 那么它应该按照如下顺序出现 2>1>3>4>5 。 如果用户搜索 苹果iphone6s 它应该是按顺序来的 1>3>2>4>5 如何使用elasticsearch实现这一点 我使用了多搜索和all。但是没有帮助 顺序应首先完全匹配,然后是前缀。然后是短语,然后是包含所有3个术语的字段,然后是包含2个术语的

我有一个名为title的字段,其值如下

  • 苹果iphone6s
  • 苹果iphone6
  • 苹果iphone 6s plus
  • 苹果iphone
  • 苹果iphone5s
  • 所以如果用户搜索

    苹果iphone6

    那么它应该按照如下顺序出现

    2>1>3>4>5

    。 如果用户搜索

    苹果iphone6s

    它应该是按顺序来的

    1>3>2>4>5

    如何使用elasticsearch实现这一点

    我使用了多搜索和all。但是没有帮助

    顺序应首先完全匹配,然后是前缀。然后是短语,然后是包含所有3个术语的字段,然后是包含2个术语的字段,然后是包含1个术语的字段,依此类推

    谢谢您的帮助。

    您可以尝试以下方法:

    {
      "query": {
        "bool":{
          "should":[
            {"match_phrase":{"title":"apple iphone 6s"}},
            {"match_phrase_prefix":{"title":"apple iphone 6s"}}
          ]
        }
      }
    }
    
    如果您想要所有包含“iphone”和“apple”的数据,您应该为搜索中的每个单词添加一个
    匹配短语前缀。

    您可以尝试:

    {
      "query": {
        "bool":{
          "should":[
            {"match_phrase":{"title":"apple iphone 6s"}},
            {"match_phrase_prefix":{"title":"apple iphone 6s"}}
          ]
        }
      }
    }
    

    如果您想要所有包含“iphone”和“apple”的数据,您应该为搜索中的每个单词添加一个
    匹配短语前缀。

    如果您想要按照指定的顺序获得结果,您需要进行此类查询:

    POST /phone/phone/_search
    {
       "query": {
          "bool": {
             "should": [                
                {
                   "match_phrase_prefix": {
                      "text": "apple iphone 6"
                   }
                },
                {
                   "match": {
                      "text": "apple iphone 6"
                   }
                }
             ]
          }
       }
    }
    
    搜索查询字符串“apple iphone 6”和结果顺序:

  • 苹果iphone6
  • 苹果iphone6s
  • 苹果iphone 6s plus
  • 苹果iphone
  • 苹果iphone5s

  • 如果要按指定的顺序获取结果,则需要进行以下查询:

    POST /phone/phone/_search
    {
       "query": {
          "bool": {
             "should": [                
                {
                   "match_phrase_prefix": {
                      "text": "apple iphone 6"
                   }
                },
                {
                   "match": {
                      "text": "apple iphone 6"
                   }
                }
             ]
          }
       }
    }
    
    搜索查询字符串“apple iphone 6”和结果顺序:

  • 苹果iphone6
  • 苹果iphone6s
  • 苹果iphone 6s plus
  • 苹果iphone
  • 苹果iphone5s

  • 我在下面这样做。它以我想要的方式给了我预期的结果

    {
        "query": {
            "filtered": {
                "query": {
                    "bool": {
                        "should": [{
                            "multi_match": {
                                "query": "apple iphone 6",
                                "fields": ["title"],
                                "operator": "and",
                                "boost": 1
                            }
                        }, {
                            "multi_match": {
                                "query": "apple iphone 6",
                                "fields": ["title"],
                                "type": "phrase_prefix",
                                "boost": 2
                            }
                        }, {
                            "multi_match": {
                                "query": "apple iphone 6",
                                "fields": ["title"],
                                "type": "phrase",
                                "boost": 3
                            }
                        }]
                    }
                }
            }
        }
    }
    

    我在下面这样做。它以我想要的方式给了我预期的结果

    {
        "query": {
            "filtered": {
                "query": {
                    "bool": {
                        "should": [{
                            "multi_match": {
                                "query": "apple iphone 6",
                                "fields": ["title"],
                                "operator": "and",
                                "boost": 1
                            }
                        }, {
                            "multi_match": {
                                "query": "apple iphone 6",
                                "fields": ["title"],
                                "type": "phrase_prefix",
                                "boost": 2
                            }
                        }, {
                            "multi_match": {
                                "query": "apple iphone 6",
                                "fields": ["title"],
                                "type": "phrase",
                                "boost": 3
                            }
                        }]
                    }
                }
            }
        }
    }
    

    在这种情况下,你认为完全匹配和短语之间有什么区别?如果用户搜索iphone 6,那么顺序也应该是2>1>3>4>5在这种情况下,完全匹配和短语之间的区别是什么?如果用户搜索iphone 6,那么顺序也应该是2>1>3>4>5标题是否正确字段是否被分析?映射将是什么?是否分析标题字段?映射将是什么?