当前位置: 首页 > 面试题库 >

Elasticsearch查询时间提升导致顺序不足的结果

常英毅
2023-03-14
问题内容

one two three应用boost每个关键字的功能后,给定搜索关键字的ES搜索结果似乎错误。请帮助我修改我的“错误”查询,以完成下文所述的“预期结果”。我在使用LUCENE
4.10.4的* ES 1.7.4 *

提升标准 - three 被认为是最重要的关键字

word - boost
----   -----
one    1
two    2
three  3

ES索引内容 - 仅显示MySQL转储以使发布更短

mysql> SELECT id, title FROM post;
+----+-------------------+
| id | title             |
+----+-------------------+
|  1 | one               |
|  2 | two               |
|  3 | three             |
|  4 | one two           |
|  5 | one three         |
|  6 | one two three     |
|  7 | two three         |
|  8 | none              |
|  9 | one abc           |
| 10 | two abc           |
| 11 | three abc         |
| 12 | one two abc       |
| 13 | one two three abc |
| 14 | two three abc     |
+----+-------------------+
14 rows in set (0.00 sec)

预期的ES查询结果 - 用户正在搜索 one two three我对记分相同的记录的顺序并不感到困惑。
我的意思是,如果记录6和13切换位置,我不在乎。

+----+-------------------+
| id | title             | my scores for demonstration purposes
+----+-------------------+
|  6 | one two three     | (1+2+3 = 6)
| 13 | one two three abc | (1+2+3 = 6)
|  7 | two three         | (2+3 = 5)
| 14 | two three abc     | (2+3 = 5)
|  5 | one three         | (1+3 = 4)
|  4 | one two           | (1+2 = 3)
| 12 | one two abc       | (1+2 = 3)
|  3 | three             | (3 = 3)
| 11 | three abc         | (3 = 3)
|  2 | two               | (2 = 2)
| 10 | two abc           | (2 = 2)
|  1 | one               | (1 = 1)
|  9 | one abc           | (1 = 1)
|  8 | none              | <- This shouldn't appear
+----+-------------------+
14 rows in set (0.00 sec)

意外的ES查询结果 - 不幸的是,这就是我得到的。

+----+-------------------+
| id | title             | _score
+----+-------------------+
|  6 | one two three     | 1.0013864
| 13 | one two three abc | 1.0013864
|  4 | one two           | 0.57794875
|  3 | three             | 0.5310148
|  7 | two three         | 0.50929534
|  5 | one three         | 0.503356
| 14 | two three abc     | 0.4074363
| 11 | three abc         | 0.36586377
| 12 | one two abc       | 0.30806428
| 10 | two abc           | 0.23231897
|  2 | two               | 0.12812772
|  1 | one               | 0.084527075
|  9 | one abc           | 0.07408653
+----+-------------------+

ES查询

curl -XPOST "http://127.0.0.1:9200/_search?post_dev" -d'
{
  "query": {
    "bool": {
      "must": {
        "match": {
          "title": {
            "query": "one two three"
          }
        }
      },
      "should": [
        {
          "match": {
            "title": {
              "query": "one",
              "boost": 1
            }
          }
        },
        {
          "match": {
            "title": {
              "query": "two",
              "boost": 2
            }
          }
        },
        {
          "match": {
            "title": {
              "query": "three",
              "boost": 3
            }
          }
        }
      ]
    }
  },
  "sort": [
    {
      "_score": {
        "order": "desc"
      }
    }
  ],
  "from": "0",
  "size": "100"
}'

其他一些测试查询:

  • 该查询不会产生任何结果。
  • 此查询不正确顺序似乎在这里。

问题答案:
# Index some test data
curl -XPUT "localhost:9200/test/doc/1" -d '{"title": "one"}'
curl -XPUT "localhost:9200/test/doc/2" -d '{"title": "two"}'
curl -XPUT "localhost:9200/test/doc/3" -d '{"title": "three"}'
curl -XPUT "localhost:9200/test/doc/4" -d '{"title": "one two"}'
curl -XPUT "localhost:9200/test/doc/5" -d '{"title": "one three"}'
curl -XPUT "localhost:9200/test/doc/6" -d '{"title": "one two three"}'
curl -XPUT "localhost:9200/test/doc/7" -d '{"title": "two three"}'
curl -XPUT "localhost:9200/test/doc/8" -d '{"title": "none"}'
curl -XPUT "localhost:9200/test/doc/9" -d '{"title": "one abc"}'
curl -XPUT "localhost:9200/test/doc/10" -d '{"title": "two abc"}'
curl -XPUT "localhost:9200/test/doc/11" -d '{"title": "three abc"}'
curl -XPUT "localhost:9200/test/doc/12" -d '{"title": "one two abc"}'
curl -XPUT "localhost:9200/test/doc/13" -d '{"title": "one two three abc"}'
curl -XPUT "localhost:9200/test/doc/14" -d '{"title": "two three abc"}'
# Make test data available for search
curl -XPOST "localhost:9200/test/_refresh?pretty"
# Search using function score
curl -XPOST "localhost:9200/test/doc/_search?pretty" -d'{
    "query": {
        "function_score": {
            "query": {
                "match": {
                    "title": "one two three"
                }
            },
            "functions": [
                {
                    "filter": {
                        "query": {
                            "match": {
                                "title": "one"
                            }
                        }
                    },
                    "weight": 1
                },
                {
                    "filter": {
                        "query": {
                            "match": {
                                "title": "two"
                            }
                        }
                    },
                    "weight": 2
                },
                {
                    "filter": {
                        "query": {
                            "match": {
                                "title": "three"
                            }
                        }
                    },
                    "weight": 3
                }
            ],
            "score_mode": "sum",
            "boost_mode": "replace"
        }
    },
    "sort": [
        {
            "_score": {
                "order": "desc"
            }
        }
    ],
    "from": "0",
    "size": "100"
}'


 类似资料:
  • 问题内容: 我安装了16gb内存的Elasticsearch。我开始使用聚合,但是在尝试发出以下查询时遇到“ java.lang.OutOfMemoryError:Java堆空间”错误: query_string本身仅返回1266次匹配,因此OOM错误让我有些困惑。 我是否正确使用了聚合?如果没有,我该怎么做才能解决此问题?谢谢! 问题答案: 您正在将整个-,-和- 字段加载到内存中以进行汇总。这

  • 对于redis查询返回结果顺序的判断,我有些怀疑,特别是对于hgetall查询 例如,我将一些数据按其枚举的顺序放入数据库: 不带任何其他参数的“keys key:*”命令是否总是按照数据在数据库中出现的顺序返回该数据,还是会尝试以任何方式对数据进行排序?

  • 问题内容: 我有一个联合查询,它从两个不同的总体中获取计数。如何强制结果按查询中写入的顺序而不是升序/降序返回? 我希望第一个结果始终作为第一行返回。这可能吗? 问题答案: 您必须使用ORDER BY子句指定订单。在您的示例中,您可以执行以下操作:

  • 我有一个elasticsearch查询,其中包括bool-must/should部分,我已经对这些部分进行了细化,以匹配搜索词,并在优先级字段中增强词,短语匹配等。 我想提升最受欢迎的文件。文档包括一个字段“受欢迎程度”,该字段指示文档被查看的次数。 最好是,我希望提升结果集中的任何离群点文档--这意味着受欢迎程度得分可能与结果集中的平均值相差2个标准差。 我看到聚合,但我感兴趣的是提高查询中的结

  • 下面嵌套的ElasticSearch查询返回一些不应该命中的结果。许多结果不包含请求的订单号,但仍然列出了。我没有得到所有的文档,所以查询肯定会在某种程度上减少结果集。 查询结果(截断): 正如您所看到的,有一个点击(实际上,有相当多的点击)不应该出现,因为没有一个订单包含请求的订单号。 这是的映射: 最后,以下是澄清上述映射中所述的分析器的设置:

  • 问题内容: 在ElasticSearch中是否有可能形成可以保留术语顺序的查询? 一个简单的例子是使用标准分析器为这些文档建立索引: 你知道要搜索 你知道搜索 知道为您搜寻 我可以查询,这将返回所有文档,包括第三个文档。 如果我只想检索按此特定顺序排列有术语的文档怎么办?我可以构成一个查询吗? 考虑到仅通过引用文本即可获得短语:(检索第一和第二文档)在我看来,应该有一种方法可以保留不相邻的多个术语