【问题标题】:How to increase Autocomplete search speed?如何提高自动完成搜索速度?
【发布时间】:2023-04-02 05:47:01
【问题描述】:

它是一个字典搜索,当一个人输入文本时,会弹出建议。 数据库是英文词典。

//Search System
        final Context ctx = this;
        autoCompleteTextView.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

                if (autoCompleteTextView.getText().length() >= 2) {
                    DbHandler handler = new DbHandler(getApplicationContext());
                    final ArrayList<String> Deflist = handler.getSearchList(autoCompleteTextView.getText().toString().trim());
                    suggestions = Deflist;


                    handler.close();
                    if (Deflist != null) {

                        Search.this.runOnUiThread(new Runnable() {
                            @Override
                            public void run() {

                                ArrayAdapter adapter = new ArrayAdapter(ctx, android.R.layout.simple_list_item_1, Deflist);
                                autoCompleteTextView.setAdapter(adapter);
                                autoCompleteTextView.setThreshold(1);
                            }
                        });
                    }

                }

            }

            @Override
            public void afterTextChanged(Editable editable) {



            }
        });

数据库代码

 public void indexDB()
    {
        try{

            getWritableDatabase().execSQL("CREATE INDEX words_index ON entries(word)");
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }




    public ArrayList<String> getSearchList(String partWord) {

        try {
            if (partWord == "") {
                return null;
            }


            ArrayList<Definition> DefList = new ArrayList<>();
            ArrayList<String> test = new ArrayList<>();
            Definition definition = null;
            Cursor cursor = getReadableDatabase().rawQuery("SELECT * FROM " + TABLE_NAME + " WHERE word LIKE '" + partWord + "%'", null);

            try {

                if (cursor.moveToFirst()) {
                    for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
                        String word = cursor.getString(cursor.getColumnIndex("word"));

                        if (!test.contains(word)) {
                            test.add(word);

                        }


                    }
                }
            } catch (Exception e) {
                cursor.close();
            }

            return test;
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return null;

}

我尝试过对其进行索引,将限制设置为 2 或更多以开始搜索,甚至尝试在单独的线程中运行(放弃了多线程的想法不一致)。有没有办法让它变得非常快?

【问题讨论】:

  • 与其从孔表中寻找,不如根据字母表缩短表
  • @NeelaySrivastava 它是一个字典数据库,它已经排序了。
  • 你的意思是,你关注了这个? developer.android.com/training/search/search.html
  • 兄弟那么你为什么不检查这个词就像一个排列问题一样检查单词“Hello”的位置 fr ex-我们首先检查 H 然后 e 的单词等等,这将减少努力
  • @NeelaySrivastava 看,它像谷歌搜索一样工作,我输入 He,它显示以 He 开头的单词,然后输入 Hel,它显示来自 Hel 的单词......等等。你的建议是找到一个特定的词。

标签: android performance


【解决方案1】:

为了优化对数据库的搜索,我们可以创建一个虚拟全文搜索表,并将表中的数据传递给 FTS 表进行搜索。

我已经为它实现了一个 API。此 API 还使用预测来获取与搜索查询相关的最接近的词。

链接-https://github.com/gauravat16/Smart-Search

    PredictiveSearch search = new PredictiveSearch(getApplicationContext());
      ArrayList<String> columns = new ArrayList<>();
      columns.add("word");
  try {
          search.createFTS4Table("learn.db", "entries", columns);
          search.ftsRebuilder(); //Use it to rebulid after any change
          ArrayList<String> resp1 = search.getSearchList("2"); //Get result w/o stemming
          ArrayList<String> resp2 = search.getGuessWord("2"); //Get result with stemming - predictive

      } catch (Exception ex) {
          ex.printStackTrace();
      } finally {
          search.close();
      }

【讨论】:

    猜你喜欢
    • 2020-12-24
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 2021-02-05
    • 2011-07-29
    相关资源
    最近更新 更多