搜索商品

//activity_main

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.bwie.test.caught_sousuo.MainActivity">
    <com.bwie.test.caught_sousuo.Shuru
        android:id="@+id/shuru"
        android:layout_width="match_parent"
        android:layout_height="80dp">
    </com.bwie.test.caught_sousuo.Shuru>

    <TextView
        android:text="热搜"
        android:textSize="30dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <com.bwie.test.caught_sousuo.fow
        android:id="@+id/ffff"
        android:layout_width="match_parent"
        android:layout_height="60dp">
    </com.bwie.test.caught_sousuo.fow>

    <TextView
        android:text="历史搜索"
        android:textSize="30dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </ListView>

    <Button
        android:onClick="shan"
        android:text="清空历史搜索"
        android:layout_width="wrap_content"
        android:layout_height="60dp" />

</LinearLayout>


//shurubuju

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <EditText
            android:id="@+id/sou"
            android:layout_weight="1"
            android:singleLine="true"
            android:layout_width="match_parent"
            android:layout_height="60dp" />
        <Button
            android:id="@+id/btn"
            android:text="搜索"
            android:layout_width="wrap_content"
            android:layout_height="60dp" />
    </LinearLayout>
</LinearLayout>


//textview_bg.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#666666"/>  
        <corners android:radius="10dp"/>  
        <padding
    android:left="5dp"
    android:right="5dp"
    android:top="5dp"
    android:bottom="5dp"/> 
</shape>


//MainActivity

public class MainActivity extends AppCompatActivity {
    private String mNames[] = {
            "硬盘螺丝","老人机","海尔冰箱",
            "电视机","旅游用品","家备小电器",
            "服饰"
    };
    private fow flowLayout;
    private EditText sou;
    private ListView lv;
    private Dao dao;
    private List<String> sel;
    private ArrayAdapter<String> adapter;
    private Shuru sr;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取控件
        sr = (Shuru) findViewById(R.id.shuru);
        lv = (ListView) findViewById(R.id.lv);
        //获取dao        dao = new Dao(MainActivity.this);
        sel = dao.sel();
        adapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_list_item_1, android.R.id.text1, sel);
        lv.setAdapter(adapter);
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                String s = sel.get(i);
                Toast.makeText(MainActivity.this,s,Toast.LENGTH_SHORT).show();
            }
        });
        info();
    }

    private void info() {
        flowLayout = (fow) findViewById(R.id.ffff);
        ViewGroup.MarginLayoutParams lp = new ViewGroup.MarginLayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        lp.leftMargin = 5;
        lp.rightMargin = 5;
        lp.topMargin = 5;
        lp.bottomMargin = 5;
        for(int i = 0; i < mNames.length; i ++){
            TextView view = new TextView(this);
            view.setText(mNames[i]);
            view.setTextColor(Color.WHITE);
            view.setBackgroundDrawable(getResources().getDrawable(R.drawable.textview_bg));
            flowLayout.addView(view,lp);
        }
    }

    //删除数据库
    public void shan(View view){
        dao.del();
        //展示数据库
        sel = dao.sel();
        adapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_list_item_1, android.R.id.text1, sel);
        lv.setAdapter(adapter);
    }
}



//Jiekou

public interface Jiekou {
    public void onclick(String js);
}


//Mysql

public class Mysql extends SQLiteOpenHelper {
    public Mysql(Context context) {
        super(context, "mysql.db", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        //创建表
        db.execSQL("create table shuju(id integer primary key,json text not null)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }
}


//Shuru

public class Shuru extends FrameLayout {
    private EditText sou;
    private Button btn;
    private Dao dao=new Dao(getContext());
    private String s;

    public Shuru(@NonNull Context context) {
        super(context);
    }

    public Shuru(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        info();
    }

    public Shuru(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    private void info() {
        View view = View.inflate(getContext(), R.layout.shurubuju, this);
        sou = view.findViewById(R.id.sou);
        btn = view.findViewById(R.id.btn);
        btn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                //获取输入框信息
                String s = sou.getText().toString();
                //判断非空添加
                if(sou==null||s.equals("")||s==null){

                }else{
                 dao.add(s);
                }
            }
        });
    }
}


//fow

public class fow extends ViewGroup {
    //存储所有子View
    private List<List<View>> mAllChildViews = new ArrayList<>();
    //每一行的高度
    private List<Integer> mLineHeight = new ArrayList<>();

    public fow(Context context) {
        super(context);
    }

    public fow(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public fow(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        //父控件传进来的宽度和高度以及对应的测量模式
        int sizeWidth = MeasureSpec.getSize(widthMeasureSpec);
        int modeWidth = MeasureSpec.getMode(widthMeasureSpec);
        int sizeHeight = MeasureSpec.getSize(heightMeasureSpec);
        int modeHeight = MeasureSpec.getMode(heightMeasureSpec);
        //如果当前ViewGroup的宽高为wrap_content的情况
        int width = 0;//自己测量的 宽度
        int height = 0;//自己测量的高度
        //记录每一行的宽度和高度
        int lineWidth = 0;
        int lineHeight = 0;

        //获取子view的个数
        int childCount = getChildCount();

        for (int i = 0; i < childCount; i++) {
            View child = getChildAt(i);
            //测量子View的宽和高
            measureChild(child, widthMeasureSpec, heightMeasureSpec);
            //得到LayoutParams
            MarginLayoutParams lp = (MarginLayoutParams) getLayoutParams();
            //View占据的宽度
            int childWidth = child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin;
            //View占据的高度
            int childHeight = child.getMeasuredHeight() + lp.topMargin + lp.bottomMargin;
            //换行时候
            if (lineWidth + childWidth > sizeWidth) {
                //对比得到最大的宽度
                width = Math.max(width, lineWidth);
                //重置lineWidth
                lineWidth = childWidth;
                //记录行高
                height += lineHeight;
                lineHeight = childHeight;
            } else {//不换行情况
                //叠加行宽
                lineWidth += childWidth;
                //得到最大行高
                lineHeight = Math.max(lineHeight, childHeight);
            }
            //处理最后一个子View的情况
            if (i == childCount - 1) {
                width = Math.max(width, lineWidth);
                height += lineHeight;
            }
        }
        //wrap_content
        setMeasuredDimension(modeWidth == MeasureSpec.EXACTLY ? sizeWidth : width,
                modeHeight == MeasureSpec.EXACTLY ? sizeHeight : height);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    @Override
    protected void onLayout(boolean b, int i, int i1, int i2, int i3) {
        mAllChildViews.clear();
        mLineHeight.clear();
        //获取当前ViewGroup的宽度
        int width = getWidth();

        int lineWidth = 0;
        int lineHeight = 0;
        //记录当前行的view
        List<View> lineViews = new ArrayList<View>();
        int childCount = getChildCount();
        for ( i = 0; i < childCount; i++) {
            View child = getChildAt(i);
            MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();
            int childWidth = child.getMeasuredWidth();
            int childHeight = child.getMeasuredHeight();

            //如果需要换行
            if (childWidth + lineWidth + lp.leftMargin + lp.rightMargin > width) {
                //记录LineHeight
                mLineHeight.add(lineHeight);
                //记录当前行的Views
                mAllChildViews.add(lineViews);
                //重置行的宽高
                lineWidth = 0;
                lineHeight = childHeight + lp.topMargin + lp.bottomMargin;
                //重置view的集合
                lineViews = new ArrayList();
            }
            lineWidth += childWidth + lp.leftMargin + lp.rightMargin;
            lineHeight = Math.max(lineHeight, childHeight + lp.topMargin + lp.bottomMargin);
            lineViews.add(child);
        }
        //处理最后一行
        mLineHeight.add(lineHeight);
        mAllChildViews.add(lineViews);

        //设置子View的位置
        int left = 0;
        int top = 0;
        //获取行数
        int lineCount = mAllChildViews.size();
        for ( i = 0; i < lineCount; i++) {
            //当前行的views和高度
            lineViews = mAllChildViews.get(i);
            lineHeight = mLineHeight.get(i);
            for (int j = 0; j < lineViews.size(); j++) {
                View child = lineViews.get(j);
                //判断是否显示
                if (child.getVisibility() == View.GONE) {
                    continue;
                }
                MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();
                int cLeft = left + lp.leftMargin;
                int cTop = top + lp.topMargin;
                int cRight = cLeft + child.getMeasuredWidth();
                int cBottom = cTop + child.getMeasuredHeight();
                //进行子View进行布局
                child.layout(cLeft, cTop, cRight, cBottom);
                left += child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin;
            }
            left = 0;
            top += lineHeight;
        }
    }

    /**
     * 与当前ViewGroup对应的LayoutParams
     */
    @Override
    public LayoutParams generateLayoutParams(AttributeSet attrs) {
        return new MarginLayoutParams(getContext(), attrs);
    }
}


//Dao

public class Dao {
    private final Mysql mysql;

    public Dao(Context ctx){
        mysql = new Mysql(ctx);
    }

    //添加
    public String add(String name){
        SQLiteDatabase db = mysql.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("json",name);
        db.insert("shuju",null,values);

        db.close();
        return null;
    }

    //查询
    public List<String> sel(){
        List<String>list=new ArrayList<>();
        SQLiteDatabase db = mysql.getReadableDatabase();
        Cursor cursor = db.rawQuery("select * from shuju",null);
        while(cursor.moveToNext()){
            String name = cursor.getString(cursor.getColumnIndex("json"));
            list.add(name);
        }
        return list;
    }

    //删除
    public void del(){
        SQLiteDatabase db = mysql.getWritableDatabase();
        db.execSQL("delete from shuju");
    }
}


### PostgreSQL 分词搜索实现方法 在 PostgreSQL 中实现分词搜索以查询商品,可以利用其内置的全文搜索功能。以下是具体实现方式: #### 1. 创建文本搜索配置 PostgreSQL 提供了多种语言的文本搜索配置,但对于中文等非拉丁语系语言,默认的分词器可能无法满足需求。可以通过扩展插件如 `pg_trgm` 或者自定义分词器来解决这一问题。例如,使用 `pg_trgm` 实现基于 n-gram 的分词[^1]。 ```sql CREATE EXTENSION IF NOT EXISTS pg_trgm; ``` #### 2. 定义商品表并创建索引 假设有一个商品表 `products`,包含字段 `id` 和 `description`(商品描述)。为了加速搜索性能,可以在 `description` 字段上创建 GIN 索引[^2]。 ```sql CREATE TABLE products ( id SERIAL PRIMARY KEY, description TEXT NOT NULL ); CREATE INDEX idx_description ON products USING GIN (description gin_trgm_ops); ``` #### 3. 使用全文搜索进行查询 PostgreSQL 的全文搜索支持复杂的查询语法,可以结合分词结果匹配用户输入。以下是一个示例查询: ```sql SELECT id, description FROM products WHERE description % '目标商品关键词'; ``` 上述查询中,`%` 运算符表示基于相似度的匹配,适合处理模糊查询场景。如果需要更精确的分词匹配,可以结合自定义分词器或第三方工具(如 Elasticsearch)实现[^1]。 #### 4. 结合多语言支持 对于跨语言的商品匹配需求,可以引入翻译服务或构建商品知识图谱。通过将不同语言的商品描述映射到统一的知识体系中,提升搜索准确性[^3]。 ```sql -- 示例:为商品添加多语言描述字段 ALTER TABLE products ADD COLUMN en_description TEXT; ALTER TABLE products ADD COLUMN zh_description TEXT; -- 查询时结合多语言字段 SELECT id, zh_description FROM products WHERE en_description % 'target product keyword'; ``` #### 5. 构建商品知识图谱 为了进一步增强搜索能力,可以构建商品知识图谱。通过实体抽取和关系分析,将商品信息组织成结构化数据存储在图数据库中[^4]。 ```python # 示例:使用 Python 调用 NER 工具进行实体抽取 import spacy nlp = spacy.load("en_core_web_sm") doc = nlp("Apple iPhone 14 Pro Max") entities = [(ent.text, ent.label_) for ent in doc.ents] print(entities) ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值