Sqlite全文搜索查询拼图

时间:2014-05-16 13:42:11

标签: sqlite

我的数据格式为yyyy-MM-dd hh:mm:ss.。它以文本形式存储。

我想要一个与给定日期相匹配的查询(yyyy-MM-dd)。

E.g

Select * from test where test MATCH '2014-03-30*'

当我尝试时,它会返回除2014年3月之外的所有数据。

如果我尝试

Select * from test where test MATCH '2014-04-30*'

它返回除2014年4月之外的所有数据。

我很困惑!...我正在得到与我想要的相反的东西!

出现这种奇怪行为的原因是什么?

这是我的完整代码....测试日期模式

public List <Transactions> GetTransactionsVirtual(String token)
    {
List<Transactions> trans = new ArrayList<Transactions>();
SQLiteDatabase db;


String sql= " Select "  + MESSAGE + "," + TDATE +  ","+ SERVICE_PROVIDER +
            "  from " + TABLE_NAME_VIRTUAL + " Where "+ TABLE_NAME_VIRTUAL + " MATCH " +  "?" +
            " Order by " + TDATE + " DESC";
//check entered string...if date string strip it ..
String pattern="^(19|20)\\d\\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])$";
String tokenedit=null;
String newtoken=null;
if (token.matches(pattern))
{
    tokenedit= token.replace("-", " ");
    Log.e("testtoken", tokenedit);
     newtoken =  tokenedit+"*" ;
}else
{
     newtoken= token+ "*";
}



String [] args= new String[]{newtoken};
Log.e("sqlamatch", sql);

db= this.getReadableDatabase();
   Cursor c = db.rawQuery(sql, args);

   if(c.moveToFirst())
   {
       do{
           Transactions t=new Transactions();

           t.setTransactiondate(c.getString(c.getColumnIndex(TDATE)));

           t.setMessage(c.getString(c.getColumnIndex(MESSAGE)));   


           t.setServiceprovider(c.getString(c.getColumnIndex(SERVICE_PROVIDER)));

           //Log.e("msg",t.getMessage().toString());

           trans.add(t);
       }while(c.moveToNext());
   }
   return trans;
    }

1 个答案:

答案 0 :(得分:0)

全文搜索机制专为搜索文本中的单词而设计。

使用默认tokenizer,日期(yyyyMMdd)的三个字段将被解析为单个独立字词,并且分隔符将被忽略

2014-03-30*这样的FTS查询会搜索

的文档(=记录)
  • 包含单词2014
  • 不包含单词03
  • 不包含以30开头的任何字词。

您需要执行phrase search

SELECT * FROM test WHERE test MATCH '"2014 03 30"'

如果您的所有数据都具有固定格式,则不应首先使用FTS表。