code: def search_callback(value, old, new):
      group_info_box.text = ""
      search_working_label.text = working_text
      logger.info("search vocab")
      global vocab, phrases_list, all_selected_phrases, search_flag
      search_flag = True
      phrases_list.value = []
      if new == "":
          new_phrases = list(cut_vocab_dict.keys())
      else:
          new_phrases = []
          for x in vocab:
              if (
                  x.lower().startswith(new.lower())
                  and vocab_dict[x] not in new_phrases
              ):
                  new_phrases.append(vocab_dict[x])
      phrases_list.options = new_phrases[0:max_visible_phrases]
      if new != "":
          phrases_list.options.sort()
      phrases_list.value = [
          vocab_dict[x]
          for x in all_selected_phrases
          if vocab_dict[x] in phrases_list.options
      ]
      logger.info(
          "selected vocab after search= %s", str(phrases_list.value)
      )
      search_working_label.text = ""
      search_flag = False
  
imports: import socket
  import pickle
  import logging
  import re
  from os.path import dirname, join
  from bokeh.layouts import column, layout
  from bokeh.models import ColumnDataSource, Div, Row, CustomJS
  from bokeh.models.widgets import Button, DataTable, TableColumn, CheckboxGroup, MultiSelect
  from bokeh.models.widgets.inputs import TextInput
  from bokeh.io import curdoc
  from settings import grouping, expand_host, expand_port
label_desc: Use image node_id 7 for calling a global function with example usage: search_callback(value, old, new) without return types