Skip to content

Instantly share code, notes, and snippets.

@equivalent
Last active November 3, 2016 14:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save equivalent/1ef71936607aaffc3d5f14ce5a22a694 to your computer and use it in GitHub Desktop.
Save equivalent/1ef71936607aaffc3d5f14ce5a22a694 to your computer and use it in GitHub Desktop.
how to tell elasticsearch to sync (refresh) data indeterminately in order to search it

Refresh tests:

Using model from https://github.com/elastic/elasticsearch-rails/blob/15761247f3e99654bda946a178e50b5365414b59/elasticsearch-persistence/examples/music/album.rb

Model:

class Album
  include Elasticsearch::Persistence::Model
  index_name [Rails.application.engine_name, Rails.env].join('-')
  attribute :title
end

non refesh

(1..100).each do |i|
  a = Album.new(title: "tom-#{i}")
  a.save
  puts i
  puts x = Album.count
  puts x == i
  puts "\n"
end

result:

1
0
false

2
1
false

3
1
false

4
1
false

5
1
false

6
1
false

7
1
false

8
1
false

9
1
false

10
1
false

11
1
false

12
1
false

13
1
false

14
1
false

15
1
false

16
1
false

17
1
false

18
1
false

19
1
false

20
1
false

21
1
false

22
1
false

23
1
false

24
1
false

25
1
false

26
1
false

27
1
false

28
1
false

29
1
false

30
1
false

31
1
false

32
1
false

33
1
false

34
1
false

35
1
false

36
1
false

37
1
false

38
22
false

39
22
false

40
22
false

41
31
false

42
31
false

43
31
false

44
31
false

45
39
false

46
39
false

47
39
false

48
39
false

49
39
false

50
39
false

51
39
false

52
39
false

53
39
false

54
39
false

55
39
false

56
39
false

57
39
false

58
39
false

59
39
false

60
39
false

61
39
false

62
39
false

63
39
false

64
39
false

65
39
false

66
39
false

67
39
false

68
39
false

69
39
false

70
39
false

71
39
false

72
39
false

73
39
false

74
39
false

75
39
false

76
39
false

77
39
false

78
39
false

79
39
false

80
39
false

81
39
false

82
39
false

83
39
false

84
39
false

85
39
false

86
39
false

87
39
false

88
39
false

89
70
false

90
70
false

91
70
false

92
80
false

93
80
false

94
80
false

95
80
false

96
80
false

97
90
false

98
90
false

99
90
false

100
90
false
```

As you can see the data is styll not beeing indexed at the time we are adding next one.

### With refresh
```

(1..100).each do |i|
  a = Album.new(title: "tom-#{i}")
  a.save(refresh: true)
  puts i
  puts x = Album.count
  puts x == i
  puts "\n"
end

```

```
1
1
true

2
2
true

3
3
true

4
4
true

5
5
true

6
6
true

7
7
true

8
8
true

9
9
true

10
10
true

11
11
true

12
12
true

13
13
true

14
14
true

15
15
true

16
16
true

17
17
true

18
18
true

19
19
true

20
20
true

21
21
true

22
22
true

23
23
true

24
24
true

25
25
true

26
26
true

27
27
true

28
28
true

29
29
true

30
30
true

31
31
true

32
32
true

33
33
true

34
34
true

35
35
true

36
36
true

37
37
true

38
38
true

39
39
true

40
40
true

41
41
true

42
42
true

43
43
true

44
44
true

45
45
true

46
46
true

47
47
true

48
48
true

49
49
true

50
50
true

51
51
true

52
52
true

53
53
true

54
54
true

55
55
true

56
56
true

57
57
true

58
58
true

59
59
true

60
60
true

61
61
true

62
62
true

63
63
true

64
64
true

65
65
true

66
66
true

67
67
true

68
68
true

69
69
true

70
70
true

71
71
true

72
72
true

73
73
true

74
74
true

75
75
true

76
76
true

77
77
true

78
78
true

79
79
true

80
80
true

81
81
true

82
82
true

83
83
true

84
84
true

85
85
true

86
86
true

87
87
true

88
88
true

89
89
true

90
90
true

91
91
true

92
92
true

93
93
true

94
94
true

95
95
true

96
96
true

97
97
true

98
98
true

99
99
true

100
100
true
```

So `resource_instance.save(refresh: true)` should be enough to ensure data is in sync. But here is a limitation in sence that technically we are locking the shard to the refresh which may be a problem on huge load (which we don't have at this point)

## Refresh at the end of indexing

But there is a better workaround `Album.gateway.refresh_index` every few records (e.g. every 25 records tell index to sync) or before you call the actual search

```
(1..100).each do |i|
  a = Album.new(title: "tom-#{i}")
  a.save
  if i % 25 == 0  #each 25 rec try to sync
         Album.gateway.refresh_index!
  end
  puts i
  puts x = Album.count
  puts x == i
  puts "\n"
end
```

look at number 25, 50, 75, 100, they are in sync !
```
1
0
false

2
0
false

3
0
false

4
0
false

5
0
false

6
0
false

7
0
false

8
0
false

9
0
false

10
0
false

11
0
false

12
0
false

13
0
false

14
0
false

15
0
false

16
0
false

17
0
false

18
0
false

19
0
false

20
0
false

21
0
false

22
7
false

23
13
false

24
20
false

25
25
true

26
25
false

27
25
false

28
25
false

29
25
false

30
25
false

31
25
false

32
25
false

33
25
false

34
25
false

35
25
false

36
25
false

37
25
false

38
25
false

39
25
false

40
25
false

41
25
false

42
25
false

43
25
false

44
25
false

45
25
false

46
25
false

47
25
false

48
25
false

49
25
false

50
50
true

51
50
false

52
50
false

53
50
false

54
50
false

55
50
false

56
50
false

57
50
false

58
50
false

59
50
false

60
50
false

61
50
false

62
53
false

63
56
false

64
61
false

65
61
false

66
61
false

67
62
false

68
62
false

69
62
false

70
62
false

71
62
false

72
62
false

73
62
false

74
62
false

75
75
true

76
75
false

77
75
false

78
75
false

79
75
false

80
75
false

81
75
false

82
75
false

83
75
false

84
75
false

85
75
false

86
75
false

87
75
false

88
75
false

89
75
false

90
75
false

91
75
false

92
75
false

93
75
false

94
75
false

95
75
false

96
75
false

97
75
false

98
75
false

99
75
false

100
100
true
```

sources

* https://github.com/elastic/elasticsearch-rails/blob/15761247f3e99654bda946a178e50b5365414b59/elasticsearch-persistence/examples/music/artists/artists_controller_test.rb
* https://www.elastic.co/blog/refreshing_news
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment