Elasticsearch术语查询排除了大量用户

时间:2016-10-29 17:30:31

标签: elasticsearch

我正在研究像应用程序一样的火种。为了排除用户之前刷过的配置文件,我使用“must_not”查询,如下所示:

  

must_not:[{“terms”:{“swipedusers”:[“userid1”,“userid1”,“userid1”...]}}}

我想知道使用这种方法的限制是什么?这是一种可扩展的方法,当swipedusers数组包含2000个用户ID时也可以使用吗?如果有更好的可扩展方法,我很高兴知道......

1 个答案:

答案 0 :(得分:1)

有更好的方法!它叫做"术语查找",就像你可以在关系数据库上做的传统连接......

我可以尝试在这里解释一下,但是,您需要的所有信息都在官方弹性搜索页面上有详细记录:

https://www.elastic.co/guide/en/elasticsearch/reference/5.0/query-dsl-terms-query.html#query-dsl-terms-lookup

最终的解决方案是拥有2个索引,一个用于注册用户,另一个用于跟踪每个用户的滑动。 然后,对于每次滑动,您应该更新包含当前用户滑动的文档...在这里,您需要向数组添加元素,这是ElasticSearch中的另一个问题(如果您使用的是AWS管理的ElasticSearch,则会出现大问题)使用脚本解决... 有关详情,请访问https://www.elastic.co/guide/en/elasticsearch/guide/current/partial-updates.html#_using_scripts_to_make_partial_updates

对于您的情况,查询将产生如下内容:

PUT /swipes
{
    "settings": {
        "auto_expand_replicas": "0-all"
    }
}

您应该考虑的另一件事是滑动索引的复制配置,因为每个节点都会执行"加入"对于该索引,强烈建议在每个节点中拥有该索引的完整副本。您可以使用" auto_expand_replicas"来创建索引。与" 0-all"值。

private void miSaveImage_Click(object sender, RoutedEventArgs e)
    {
        ImageBrush bi = (ImageBrush)canvas.Background;
        Rect bounds = VisualTreeHelper.GetDescendantBounds(canvas);
        double pw = (bi.ImageSource as BitmapSource).PixelWidth;
        double ph = (bi.ImageSource as BitmapSource).PixelHeight;
        double px = (bi.ImageSource as BitmapSource).DpiX;
        double py = (bi.ImageSource as BitmapSource).DpiY;
        //Get the actual width and height of the image, then the dpi and render an image of it
        RenderTargetBitmap rtb = new RenderTargetBitmap((int)pw, (int)ph, px*96, py*96, System.Windows.Media.PixelFormats.Default);

        rtb.Render(canvas);
        //create the encoder and save the image data to it.
        BitmapEncoder pngEncoder = new PngBitmapEncoder();
        pngEncoder.Frames.Add(BitmapFrame.Create(rtb));

        try
        {
            //eventually I need to make this a save dialog but that will come later.
            System.IO.MemoryStream ms = new System.IO.MemoryStream();

            pngEncoder.Save(ms);
            ms.Close();

            System.IO.File.WriteAllBytes("Sample.png", ms.ToArray());
        }
        catch (Exception err)
        {
            MessageBox.Show(err.ToString(), "Problem saving image", MessageBoxButton.OK, MessageBoxImage.Error);
        }

    }